@@ -6,7 +6,6 @@ import org.gitanimals.core.*
66import org.gitanimals.render.domain.event.PersonaDeleted
77import org.gitanimals.render.domain.event.UserContributionUpdated
88import org.gitanimals.render.domain.extension.RenderFieldTypeExtension.isRenderField
9- import org.gitanimals.core.DomainEventPublisher
109import org.gitanimals.render.domain.response.PersonaResponse
1110import org.gitanimals.render.domain.value.Contribution
1211import org.gitanimals.render.domain.value.Level
@@ -20,14 +19,20 @@ import kotlin.math.min
2019
2120@AggregateRoot
2221@Entity(name = " user" )
23- @Table(name = " user" , indexes = [Index (columnList = " name" )])
22+ @Table(
23+ name = " user" ,
24+ indexes = [
25+ Index (columnList = " name" , unique = true ),
26+ Index (columnList = " entry_point, authentication_id" , unique = true ),
27+ ],
28+ )
2429class User (
2530 @Id
2631 @Column(name = " id" )
2732 val id : Long ,
2833
2934 @Column(name = " name" , unique = true , nullable = false )
30- val name : String ,
35+ private var name : String ,
3136
3237 @OneToMany(
3338 mappedBy = " user" ,
@@ -58,11 +63,31 @@ class User(
5863 @Version
5964 @Column(name = " version" , nullable = false )
6065 val version : Long ,
66+
67+ @Embedded
68+ private var authInfo : UserAuthInfo ? = null ,
6169) : AbstractTime() {
70+
6271 init {
6372 personas.forEach { it.user = this }
6473 }
6574
75+ fun getName (): String = this .name
76+
77+ fun updateName (name : String ) {
78+ this .name = name
79+ }
80+
81+ fun isAuthInfoSet (): Boolean = authInfo != null
82+
83+ fun setAuthInfo (entryPoint : EntryPoint , authenticationId : String ) {
84+ require(authInfo == null ) {
85+ " Cannot set user auth info cause user auth is not null."
86+ }
87+
88+ authInfo = UserAuthInfo (entryPoint = entryPoint, authenticationId = authenticationId)
89+ }
90+
6691 fun addPersona (id : Long , personaType : PersonaType , level : Int ): PersonaResponse {
6792 val persona = Persona (id, personaType, Level (level.toLong()), personas.size < 30 , this )
6893
@@ -152,7 +177,7 @@ class User(
152177
153178 DomainEventPublisher .publish(
154179 UserContributionUpdated (
155- username = this .name ,
180+ username = this .getName() ,
156181 updatedContributions = afterContribution - beforeContribution,
157182 contributions = afterContribution,
158183 )
@@ -296,7 +321,12 @@ class User(
296321
297322 private val nameConvention = Regex (" [^a-zA-Z0-9-]" )
298323
299- fun newUser (name : String , contributions : Map <Int , Int >): User {
324+ fun newUser (
325+ name : String ,
326+ contributions : Map <Int , Int >,
327+ entryPoint : EntryPoint ,
328+ authenticationId : String
329+ ): User {
300330 require(! nameConvention.containsMatchIn(name)) {
301331 throw IllegalArgumentException (" Not supported word contained in \" ${name} \" " )
302332 }
@@ -313,6 +343,7 @@ class User(
313343 visit = 1 ,
314344 version = 0 ,
315345 lastPersonaGivePoint = (totalContributionCount(contributions) % FOR_NEW_PERSONA_COUNT ).toInt(),
346+ authInfo = UserAuthInfo (entryPoint, authenticationId),
316347 )
317348
318349 user.addField(FieldType .WHITE_FIELD )
0 commit comments