0

Grails モデルの関連付けに問題があります。ここに問題があります:

  • Subscriber と Customer は PartyRole から拡張されます。
  • 顧客には多くの加入者がいて、加入者は顧客に属します。
  • Party は多くの PartyRole を持つことができます。
  • Person と Organization は Party から拡張されます。
  • 個人は組織に属します。
  • 個人には多くのプロファイルがあり、プロファイルは個人に属します。

ここで、現在ログインしているユーザー(サブスクライバー)を編集したいと思います。これは基本的に組織タイプであり、orgName や orgSize などの組織プロパティを意味します。

ログインしたユーザー (サブスクライバー) を使用して、個人 (firstName と lastName) とプロファイル (電子メール) の詳細を見つけることができますが、組織の詳細を取得することはできません。コードは次のとおりです。

 def profile = {
    Subscriber loggedinSubscriber = Subscriber.get( springSecurityService.principal.id )
    if (loggedinSubscriber == null){
      redirect(controller: "login" , action:"login");
    }
    else{
      println loggedinSubscriber
      Party person = Person?.get(loggedinSubscriber.party.id)
      Party org = Organization?.get(loggedinSubscriber.party.id)
      Profile profile = person?.profile
      [userInstance: person, authorityList: sortedRoles()]
    }
  }

で組織の詳細を取得しようとしたとき

Party org = Organization?.get(loggedinSubscriber.party.id)

null 値を取得しましたが、同じようにログイン ユーザー (サブスクライバー) を使用して個人の詳細を取得でき、両方とも Party から拡張されています。

組織の詳細を取得する方法についてのアイデア。

人:

package com.vproc.member

import com.vproc.enquiry.Enquiry;
import com.vproc.enquiry.Membership;
import com.vproc.enquiry.Notification;
import com.vproc.enquiry.Team;

class Person extends Party{

    String firstName
    String lastName

    Profile profile
    static belongsTo = [Organization]

    static constraints = {
        lastName nullable:true
        firstName blank:false

    }

}

**Organization:**

package com.vproc.member

import java.util.Date;

class Organization extends Party{

    String orgName 
    Person contact
    int orgSize
    boolean isVendor 

    static constraints = {
    }
}

プロフィール:

package com.vproc.member

import java.util.Date;

import com.vproc.enquiry.Enquiry;
import com.vproc.enquiry.Membership;
import com.vproc.enquiry.Team;

class Profile {

    String emailAddress  //  field governed by privacy policy
    String phoneNumber   //  field governed by privacy policy
    Date dateCreated
    Date lastUpdated
    boolean isDefaultProfile
  String status
    static belongsTo = [person:Person]
    //ProfilePrivacyLevelEnum privacyLevel = ProfilePrivacyLevelEnum.Private

    static constraints = {
    }
}

加入者:

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)
    }
}

パーティ:

パッケージ com.vproc.member

java.util.Date をインポートします。

class Party {

    Date dateCreated
    Date lastUpdated

    static constraints = {
    }

    static mapping = {
        tablePerHierarchy false 
    }
}

パーティの役割:

パッケージ com.vproc.member

java.util.Date をインポートします。

class PartyRole {

    Party party

    Date dateCreated
    Date lastUpdated
    static constraints = {
    }
    static mapping = {
        tablePerHierarchy false 
    }
}

ブートストラップ:

クラスブートストラップ{

def init = { servletContext ->

def userRole = Role.findByAuthority('ROLE_USER') ?: new Role(authority: 'ROLE_USER').save(failOnError: true)
def adminRole = Role.findByAuthority('ROLE_COMPANY_ADMIN') ?: new Role(authority: 'ROLE_COMPANY_ADMIN').save(failOnError: true)
def guestRole = Role.findByAuthority('ROLE_GUEST') ?: new Role(authority: 'ROLE_GUEST').save(failOnError: true)
def csrRole = Role.findByAuthority('ROLE_CSR') ?: new Role(authority: 'ROLE_CSR').save(failOnError: true)

//PersonRole.create adminUser, adminRole
def address = new Address( city : 'Pune' , stateCode : 'MH' , countryCode : 'IN'   )

def adminProfile = Profile.findByEmailAddress('sachin.jha@gmail.com' )?: new Profile(
    privacyLevel: ProfilePrivacyLevelEnum.Private,
    emailAddress:  "sachin.jha@gmail.com" ,
    phoneNumber: "9325507992",
    status : 'Active'
    ).save( failOnError: true)

 def adminPerson = Person.findByProfile( adminProfile) ?: new Person( firstName: 'admin' , lastName : 'user' , profile: adminProfile).save( failOnError: true) ;
 def vprocOrganization = Organization.findByOrgName('VPROCURE') ?: new Organization ( orgName: 'VPROCURE' , orgSize : 100 , mailingAddress: address, contact: adminPerson ).save( failOnError: true)
 def vprocCustomer = Customer.findByParty( vprocOrganization) ?: new Customer ( party: vprocOrganization, status: StatusEnum.Active  ).save(failOnError: true) ;
 def adminUser = Subscriber.findByUsername('admin') ?: new Subscriber( username : 'admin' ,  password : 'passw0rd' , enabled: true , party: adminPerson, customer: vprocCustomer , status: StatusEnum.Active ).save( failOnError: true)

 if ( !adminUser.authorities.contains(adminRole)){
      SubscriberRole.create adminUser, adminRole
    }

  JSON.registerObjectMarshaller(Date) {
     return it?.format("MM/dd/yyyy")
  }

    def userProfile = Profile.findByEmailAddress( 'sachin.jha.user@gmail.com') ?: new Profile(
        privacyLevel: ProfilePrivacyLevelEnum.Private,
        emailAddress: "sachin.jha.user@gmail.com",
        phoneNumber : "9325507992",
        status : 'Active'
        ).save( failOnError: true)

    def userPerson = Person.findByProfile( userProfile) ?: new Person( firstName: 'plain' , lastName : 'user' , profile: userProfile).save( failOnError: true) ;
    def plainUser = Subscriber.findByUsername('plainuser') ?: new Subscriber( username: 'plainuser', password : 'passw0rd' , enabled: true , party: userPerson, customer: vprocCustomer , status: StatusEnum.Active ).save( failOnError : true )
    if ( !plainUser.authorities.contains(userRole)){
        SubscriberRole.create  plainUser, userRole
    }

/*vprocCustomer.addToSubscribers(amdinUser)
vprocCustomer.addToSubscribers(plainUser)
vprocCustomer.save( failOnError : true);*/

}

def destroy = {
}

}

4

1 に答える 1