0

grails アプリケーションにユーザー認証用のスプリング セキュリティ サービスを実装しました。Subscriber.groovy(user テーブル) と Contact.groovy ドメインがあります。サブスクライバー (ユーザー) がログインすると、連絡先を作成できます。サブスクライバーと連絡先ドメインの間には hasMany の関係があります。

問題: 現在ログインしているユーザーまたはサブスクライバーが連絡先ページに作成した連絡先の検索機能を実装しました。正常に動作しますが、システム内のすべての連絡先を取得しますが、現在ログインしているサブスクライバー (ユーザー) によって作成された連絡先のみが必要です。現在ログインしている加入者によって作成された連絡先を検索する方法。

連絡先テーブルから連絡先を検索する方法

def searchAJAX = {
    def contacts = Contact.findAllByNameLike("%${params.query}%")
      //Create XML response
      render(contentType: "text/xml") {
        results() {
          contacts.each { contact ->
           result(){
             name(contact.name)
              //Optional id which will be available in onItemSelect
                id(contact.id)
            }
          }
        }
      }

}

ContactController.groovy

package com.vproc.member

import grails.converters.*

class ContactController {

  def springSecurityService
    def subscriberService
  def imageUploadService
  def searchableService
  def autoCompleteService

  static allowedMethods = [save: "POST", update: "POST", delete: "POST"]

  def index() {
    redirect(action: "list", params: params)
  }

  def list() {

    Subscriber loggedinSubscriber = Subscriber.get( springSecurityService.principal.id )
    List<Contact>contactsList = new ArrayList<Contact>();
    loggedinSubscriber?.contacts.each { it ->
        contactsList.add(it)
    }
    [contactInstanceList:contactsList , contactInstanceTotal: contactsList.size() ]
  }

  def create() {
    [contactInstance: new Contact(params)]
  }

  def save() {
    // params.birthday = Date.parse( 'MM/dd/yyyy', params.birthday )
    if (params.birthday){
        params.birthday = (new SimpleDateFormat("MM/dd/yyyy")).parse(params.birthday)
    }
    def contactInstance = new Contact(params)
    Subscriber loggedinSubscriber = Subscriber.get( springSecurityService.principal.id )
    if (loggedinSubscriber == null)
      System.out.println("not able to save")

    else {
      if (!loggedinSubscriber.contacts){
        loggedinSubscriber.contacts = new ArrayList<Contact>();
      }
      loggedinSubscriber.contacts.add(contactInstance)

      if (!loggedinSubscriber.save(flush: true)) {
        flash.message = message(code: 'default.created.message', args: [message(code: 'contact.label', default: 'Contact'), contactInstance.id])
        render(view: "create", model: [contactInstance: contactInstance])
        return
      }
    }

    flash.message = message(code: 'default.created.message', args: [message(code: 'contact.label', default: 'Contact'), contactInstance.id])
    redirect(action: "list")
  }



  // enable search for contacts
  def contact_search = {
    def query = params.q
    if(query){
      def srchResults = searchableService.search(query)
      render(view: "list",
        model: [contactInstanceList: srchResults.results,
        contactInstanceTotal:srchResults.total])
    }
    else{
        render "not record found";
    }
  }

  // fetch name from contact table for autocomplete on contact
  def searchAJAX = {

    def contacts = Contact.findAllByNameLike("%${params.query}%")
      //Create XML response
      render(contentType: "text/xml") {
        results() {
          contacts.each { contact ->
           result(){
             name(contact.name)
              //Optional id which will be available in onItemSelect
                id(contact.id)
            }
          }
        }
      }
   }
}

お問い合わせ.groovy

package com.vproc.member

import java.util.Date;

import com.vproc.common.Tag;
import com.vproc.enquiry.ContactType;
import grails.converters.JSON;

class Contact {

    String name
    String phoneNumber
    String emailAddress
    Gender gender
    String url
    String note
    byte[] image
    String address
    Date dateCreated
    Date lastUpdated
    ContactType contactType
    Date birthday

    static belongsTo = [Subscriber]
    static hasMany = [tags:Tag ,   shares: SharedContact]
    static  constraints = {
        image nullable: true
        phoneNumber nullable: true
        url nullable :true
        address nullable :true
        gender nullable :true
        note nullable :true
        contactType nullable :true
        birthday nullable :true

    }

    static mapping = {
     note(type: 'text')
  }



     //static searchable = [only: ['name', 'emailAddress']]
      static searchable = true

     static scaffold = true
    //static searchable = true
}

Subscriber.groovy

package com.vproc.member

import java.util.Date;

import com.vproc.common.StatusEnum;
import com.vproc.enquiry.Discussion;
import com.vproc.enquiry.Enquiry;
import com.vproc.enquiry.Membership;
import com.vproc.enquiry.Notification;
import com.vproc.enquiry.SharedEnquiry;
import com.vproc.enquiry.Team;
import com.vproc.order.Seat;

class Subscriber extends PartyRole{

    transient springSecurityService

    String username
    String password
    boolean enabled
    boolean accountExpired
    boolean accountLocked
    boolean passwordExpired
    StatusEnum status
    Date dateCreated
    Date lastUpdated
    List<Contact> contacts ;

    static belongsTo = [ customer: Customer]
    static hasMany = [seats: Seat, ownedEnquiries: Enquiry,enquiresSharedWith: SharedEnquiry, enquiriesSharedBy: SharedEnquiry ,
         managedTeams: Team , memberships: Membership, contacts: Contact , sharedByContacts: SharedContact, sharedWithContacts: SharedContact,
          vContacts: VContact, partOf: VContact,  sharedbyVContacts: SharedVcontact, sharedWithVcontacts: SharedVcontact,
          notifications: Notification, discussions: Discussion]
    static mappedBy = [ managedTeams : "manager" , enquiresSharedWith: "sharedWith" , enquiriesSharedBy: "sharedBy"  ,
                                                   sharedByContacts : "sharedBy" , sharedWithContacts : "sharedWith" ,
                                                   vContacts: "forSubscriber"  ,  partOf :"ofContact",
                                                   sharedbyVContacts: "sharedby" , sharedWithVcontacts :"sharedWith"
                                                    ]


    static constraints = {
        username  validator : { val , obj ->
                                 if (obj.status != StatusEnum.Pending)
                                        val!= null
                               }
        username unique: true
        password validator : { val , obj ->
                                    if (obj.status != StatusEnum.Pending)
                                        val != null
                             }

        contacts nullable: true
        notifications nullable : true
        username nullable: true
        password nullable: true

    }

    static mapping = {
        password column: '`password`'
    }

    Set<Role> getAuthorities() {
        SubscriberRole.findAllBySubscriber(this).collect { it.role } as Set
    }

    def beforeInsert() {
        encodePassword()
    }

    def beforeUpdate() {
        if (isDirty('password')) {
            encodePassword()
        }
    }

    protected void encodePassword() {
        password = springSecurityService.encodePassword(password)
    }
}

Contact コントローラーの保存アクション

def save() {
    // params.birthday = Date.parse( 'MM/dd/yyyy', params.birthday )
    if (params.birthday){
        params.birthday = (new SimpleDateFormat("MM/dd/yyyy")).parse(params.birthday)
    }
    def contactInstance = new Contact(params)
    Subscriber loggedinSubscriber = Subscriber.get( springSecurityService.principal.id )
    if (loggedinSubscriber == null)
      System.out.println("not able to save")

    else {
      if (!loggedinSubscriber.contacts){
        loggedinSubscriber.contacts = new ArrayList<Contact>();
      }
      loggedinSubscriber.contacts.add(contactInstance)

      if (!loggedinSubscriber.save(flush: true)) {
        flash.message = message(code: 'default.created.message', args: [message(code: 'contact.label', default: 'Contact'), contactInstance.id])
        render(view: "create", model: [contactInstance: contactInstance])
        return
      }
    }

    flash.message = message(code: 'default.created.message', args: [message(code: 'contact.label', default: 'Contact'), contactInstance.id])
    redirect(action: "list")
  }

:連絡先の保存中に、連絡先コントローラーの保存アクションでサブスクライバーにログインしましたが、連絡先を検索するためのsearchAjaxであるメソッドの下で使用する方法がわかりません。

4

1 に答える 1

0

Subscriberas に関連付けがあると仮定するとContact

class Subscriber {

   static hasMany = [contacts: Contact]

}

次に、サブスクライバー ユーザーのすべての連絡先を取得するには、

subscriberInstance.contacts

同じサブスクライバーが使用する連絡先間でクエリを実行するには、

subscriberInstance.findByContact('your_query_string')

リファレンスについては、ドキュメントhttp://grails.org/doc/latest/guide/GORM.html#queryingで関連付けのクエリを参照してください。

于 2013-09-02T09:40:17.193 に答える