1 /*
2  *  Make.org Core API
3  *  Copyright (C) 2018 Make.org
4  *
5  * This program is free software: you can redistribute it and/or modify
6  *  it under the terms of the GNU Affero General Public License as
7  *  published by the Free Software Foundation, either version 3 of the
8  *  License, or (at your option) any later version.
9  *
10  *  This program is distributed in the hope that it will be useful,
11  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
12  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13  *  GNU Affero General Public License for more details.
14  *
15  *  You should have received a copy of the GNU Affero General Public License
16  *  along with this program.  If not, see <https://www.gnu.org/licenses/>.
17  *
18  */
19 
20 package org.make.api.user
21 
22 import org.make.api.question.AuthorRequest
23 import org.make.api.technical.auth.TokenResponse
24 import org.make.api.technical.job.JobActor.Protocol.Response.JobAcceptance
25 import org.make.api.user.social.models.UserInfo
26 import org.make.core.profile.{Gender, SocioProfessionalCategory}
27 import org.make.core.question.QuestionId
28 import org.make.core.reference.{Country, Language}
29 import org.make.core.technical.Pagination
30 import org.make.core.user._
31 import org.make.core.{EventId, Order, RequestContext}
32 
33 import java.time.{LocalDate, ZonedDateTime}
34 import scala.concurrent.Future
35 
36 trait UserServiceComponent {
37   def userService: UserService
38 }
39 
40 trait UserService {
41   def getUser(id: UserId): Future[Option[User]]
42   def getPersonality(id: UserId): Future[Option[User]]
43   def getUserByEmail(email: String): Future[Option[User]]
44   def getUserByUserIdAndPassword(userId: UserId, password: Option[String]): Future[Option[User]]
45   def getUserByEmailAndPassword(email: String, password: String): Future[Option[User]]
46   def getUsersByUserIds(ids: Seq[UserId]): Future[Seq[User]]
47   def adminFindUsers(
48     offset: Pagination.Offset,
49     end: Option[Pagination.End],
50     sort: Option[String],
51     order: Option[Order],
52     ids: Option[Seq[UserId]],
53     email: Option[String],
54     firstName: Option[String],
55     lastName: Option[String],
56     role: Option[Role],
57     userType: Option[UserType]
58   ): Future[Seq[User]]
59   def register(userRegisterData: UserRegisterData, requestContext: RequestContext): Future[User]
60   def registerPersonality(
61     personalityRegisterData: PersonalityRegisterData,
62     requestContext: RequestContext
63   ): Future[User]
64   def registerVirtualUser(
65     virtualUserRegisterData: VirtualUserRegisterData,
66     requestContext: RequestContext
67   ): Future[User]
68   def registerExternalUser(
69     externalUserRegisterData: ExternalUserRegisterData,
70     requestContext: RequestContext
71   ): Future[User]
72   def updateConnectionInfos(
73     userId: UserId,
74     lastConnection: Option[ZonedDateTime],
75     connectionAttemptsSinceLastSuccessful: Int,
76     privacyPolicyApprovalDate: Option[ZonedDateTime]
77   ): Future[Unit]
78   def update(user: User, requestContext: RequestContext): Future[User]
79   def updatePersonality(
80     personality: User,
81     moderatorId: Option[UserId],
82     oldEmail: String,
83     requestContext: RequestContext
84   ): Future[User]
85   def createOrUpdateUserFromSocial(
86     userInfo: UserInfo,
87     questionId: Option[QuestionId],
88     country: Country,
89     language: Language,
90     crmCountry: Country,
91     crmLanguage: Language,
92     requestContext: RequestContext,
93     privacyPolicyApprovalDate: Option[ZonedDateTime],
94     optIn: Option[Boolean]
95   ): Future[(User, Boolean)]
96   def requestPasswordReset(userId: UserId): Future[Boolean]
97   def updatePassword(userId: UserId, resetToken: Option[String], password: String): Future[Boolean]
98   def validateEmail(user: User, verificationToken: String): Future[TokenResponse]
99   def updateOptInNewsletter(userId: UserId, optInNewsletter: Boolean): Future[Boolean]
100   def updateOptInNewsletter(email: String, optInNewsletter: Boolean): Future[Boolean]
101   def updateIsHardBounce(userId: UserId, isHardBounce: Boolean): Future[Boolean]
102   def updateIsHardBounce(email: String, isHardBounce: Boolean): Future[Boolean]
103   def updateLastMailingError(userId: UserId, lastMailingError: Option[MailingErrorLog]): Future[Boolean]
104   def updateLastMailingError(email: String, lastMailingError: Option[MailingErrorLog]): Future[Boolean]
105   def getUsersWithoutRegisterQuestion: Future[Seq[User]]
106   def anonymize(user: User, adminId: UserId, requestContext: RequestContext, mode: Anonymization): Future[Unit]
107   def anonymizeInactiveUsers(adminId: UserId, requestContext: RequestContext): Future[JobAcceptance]
108   def getFollowedUsers(userId: UserId): Future[Seq[UserId]]
109   def followUser(followedUserId: UserId, userId: UserId, requestContext: RequestContext): Future[UserId]
110   def unfollowUser(followedUserId: UserId, userId: UserId, requestContext: RequestContext): Future[UserId]
111   def retrieveOrCreateVirtualUser(userInfo: AuthorRequest, country: Country): Future[User]
112   def retrieveOrCreateExternalUser(
113     email: String,
114     userInfo: AuthorRequest,
115     country: Country,
116     lineNumber: Int
117   ): Future[User]
118   def adminCountUsers(
119     ids: Option[Seq[UserId]],
120     email: Option[String],
121     firstName: Option[String],
122     lastName: Option[String],
123     role: Option[Role],
124     userType: Option[UserType]
125   ): Future[Int]
126   def reconnectInfo(userId: UserId): Future[Option[ReconnectInfo]]
127   def changeEmailVerificationTokenIfNeeded(userId: UserId): Future[Option[User]]
128   def changeAvatarForUser(
129     userId: UserId,
130     avatarUrl: String,
131     requestContext: RequestContext,
132     eventDate: ZonedDateTime
133   ): Future[Unit]
134   def adminUpdateUserEmail(user: User, email: String): Future[Unit]
135   def isThrottled(username: String): Future[Boolean]
136   // def registerSucessfulConnectionAttempt(userId: UserId): Future[Unit]
137   def registerFailedConnectionAttempt(username: String): Future[Unit]
138 }
139 
140 trait RegisterData {
141   val email: String
142   val firstName: Option[String] = None
143   val lastName: Option[String] = None
144   def trim: RegisterData
145 }
146 
147 final case class UserRegisterData(
148   email: String,
149   override val firstName: Option[String],
150   override val lastName: Option[String] = None,
151   password: Option[String],
152   lastIp: Option[String],
153   dateOfBirth: Option[LocalDate] = None,
154   profession: Option[String] = None,
155   postalCode: Option[String] = None,
156   gender: Option[Gender] = None,
157   socioProfessionalCategory: Option[SocioProfessionalCategory] = None,
158   country: Country,
159   language: Language,
160   crmCountry: Country,
161   crmLanguage: Language,
162   questionId: Option[QuestionId] = None,
163   optIn: Option[Boolean] = None,
164   optInPartner: Option[Boolean] = None,
165   roles: Seq[Role] = Seq(Role.RoleCitizen),
166   availableQuestions: Seq[QuestionId] = Seq.empty,
167   availableEvents: Seq[EventId] = Seq.empty,
168   politicalParty: Option[String] = None,
169   website: Option[String] = None,
170   publicProfile: Boolean = false,
171   legalMinorConsent: Option[Boolean] = None,
172   legalAdvisorApproval: Option[Boolean] = None,
173   privacyPolicyApprovalDate: Option[ZonedDateTime] = None
174 ) extends RegisterData {
175   def trim: UserRegisterData =
176     copy(email = email.trim, firstName = firstName.map(_.trim), lastName = lastName.map(_.trim))
177 }
178 
179 final case class PersonalityRegisterData(
180   email: String,
181   override val firstName: Option[String],
182   override val lastName: Option[String],
183   gender: Option[Gender],
184   genderName: Option[String],
185   country: Country,
186   language: Language,
187   description: Option[String],
188   avatarUrl: Option[String],
189   website: Option[String],
190   politicalParty: Option[String]
191 ) extends RegisterData {
192   def trim: PersonalityRegisterData =
193     copy(email = email.trim, firstName = firstName.map(_.trim), lastName = lastName.map(_.trim))
194 }
195 
196 final case class VirtualUserRegisterData(
197   email: String,
198   override val firstName: Option[String],
199   age: Option[Int],
200   country: Country,
201   language: Language
202 ) extends RegisterData {
203   def trim: VirtualUserRegisterData = copy(email = email.trim, firstName = firstName.map(_.trim))
204 }
205 
206 final case class ExternalUserRegisterData(
207   email: String,
208   override val firstName: Option[String],
209   age: Option[Int],
210   country: Country,
211   language: Language
212 ) extends RegisterData {
213   def trim: ExternalUserRegisterData = copy(email = email.trim, firstName = firstName.map(_.trim))
214 }
Line Stmt Id Pos Tree Symbol Tests Code
142 28871 5867 - 5871 Select scala.None org.make.api.organisation.organisationservicetest scala.None
143 30316 5905 - 5909 Select scala.None org.make.api.organisation.organisationservicetest scala.None
176 29215 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$12 org.make.api.user.userservicetest UserRegisterData.this.copy$default$12
176 30354 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$19 org.make.api.user.userservicetest UserRegisterData.this.copy$default$19
176 29747 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$5 org.make.api.user.userservicetest UserRegisterData.this.copy$default$5
176 28850 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$24 org.make.api.user.userservicetest UserRegisterData.this.copy$default$24
176 30351 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$10 org.make.api.user.userservicetest UserRegisterData.this.copy$default$10
176 29878 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$26 org.make.api.user.userservicetest UserRegisterData.this.copy$default$26
176 28876 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$15 org.make.api.user.userservicetest UserRegisterData.this.copy$default$15
176 28302 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$13 org.make.api.user.userservicetest UserRegisterData.this.copy$default$13
176 29839 7030 - 7040 Apply java.lang.String.trim org.make.api.user.userservicetest UserRegisterData.this.email.trim()
176 29776 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$23 org.make.api.user.userservicetest UserRegisterData.this.copy$default$23
176 29043 7017 - 7109 Apply org.make.api.user.UserRegisterData.copy org.make.api.user.userservicetest UserRegisterData.this.copy(UserRegisterData.this.email.trim(), UserRegisterData.this.firstName.map[String](((x$1: String) => x$1.trim())), UserRegisterData.this.lastName.map[String](((x$2: String) => x$2.trim())), UserRegisterData.this.copy$default$4, UserRegisterData.this.copy$default$5, UserRegisterData.this.copy$default$6, UserRegisterData.this.copy$default$7, UserRegisterData.this.copy$default$8, UserRegisterData.this.copy$default$9, UserRegisterData.this.copy$default$10, UserRegisterData.this.copy$default$11, UserRegisterData.this.copy$default$12, UserRegisterData.this.copy$default$13, UserRegisterData.this.copy$default$14, UserRegisterData.this.copy$default$15, UserRegisterData.this.copy$default$16, UserRegisterData.this.copy$default$17, UserRegisterData.this.copy$default$18, UserRegisterData.this.copy$default$19, UserRegisterData.this.copy$default$20, UserRegisterData.this.copy$default$21, UserRegisterData.this.copy$default$22, UserRegisterData.this.copy$default$23, UserRegisterData.this.copy$default$24, UserRegisterData.this.copy$default$25, UserRegisterData.this.copy$default$26)
176 29806 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$8 org.make.api.user.userservicetest UserRegisterData.this.copy$default$8
176 28873 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$6 org.make.api.user.userservicetest UserRegisterData.this.copy$default$6
176 29010 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$18 org.make.api.user.userservicetest UserRegisterData.this.copy$default$18
176 30311 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$16 org.make.api.user.userservicetest UserRegisterData.this.copy$default$16
176 30314 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$25 org.make.api.user.userservicetest UserRegisterData.this.copy$default$25
176 30230 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$7 org.make.api.user.userservicetest UserRegisterData.this.copy$default$7
176 28803 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$21 org.make.api.user.userservicetest UserRegisterData.this.copy$default$21
176 29542 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$11 org.make.api.user.userservicetest UserRegisterData.this.copy$default$11
176 30388 7054 - 7075 Apply scala.Option.map org.make.api.user.userservicetest UserRegisterData.this.firstName.map[String](((x$1: String) => x$1.trim()))
176 29114 7088 - 7108 Apply scala.Option.map org.make.api.user.userservicetest UserRegisterData.this.lastName.map[String](((x$2: String) => x$2.trim()))
176 28396 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$22 org.make.api.user.userservicetest UserRegisterData.this.copy$default$22
176 29051 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$9 org.make.api.user.userservicetest UserRegisterData.this.copy$default$9
176 29045 7068 - 7074 Apply java.lang.String.trim org.make.api.user.userservicetest x$1.trim()
176 29909 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$17 org.make.api.user.userservicetest UserRegisterData.this.copy$default$17
176 29667 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$14 org.make.api.user.userservicetest UserRegisterData.this.copy$default$14
176 29541 7101 - 7107 Apply java.lang.String.trim org.make.api.user.userservicetest x$2.trim()
176 28342 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$4 org.make.api.user.userservicetest UserRegisterData.this.copy$default$4
176 29544 7017 - 7017 Select org.make.api.user.UserRegisterData.copy$default$20 org.make.api.user.userservicetest UserRegisterData.this.copy$default$20
193 28805 7577 - 7598 Apply scala.Option.map org.make.api.user.userservicetest PersonalityRegisterData.this.firstName.map[String](((x$3: String) => x$3.trim()))
193 28780 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$10 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$10
193 29746 7611 - 7631 Apply scala.Option.map org.make.api.user.userservicetest PersonalityRegisterData.this.lastName.map[String](((x$4: String) => x$4.trim()))
193 29049 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$7 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$7
193 29596 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$9 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$9
193 30281 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$5 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$5
193 28854 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$4 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$4
193 28301 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$11 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$11
193 30358 7553 - 7563 Apply java.lang.String.trim org.make.api.user.userservicetest PersonalityRegisterData.this.email.trim()
193 29751 7540 - 7632 Apply org.make.api.user.PersonalityRegisterData.copy org.make.api.user.userservicetest PersonalityRegisterData.this.copy(PersonalityRegisterData.this.email.trim(), PersonalityRegisterData.this.firstName.map[String](((x$3: String) => x$3.trim())), PersonalityRegisterData.this.lastName.map[String](((x$4: String) => x$4.trim())), PersonalityRegisterData.this.copy$default$4, PersonalityRegisterData.this.copy$default$5, PersonalityRegisterData.this.copy$default$6, PersonalityRegisterData.this.copy$default$7, PersonalityRegisterData.this.copy$default$8, PersonalityRegisterData.this.copy$default$9, PersonalityRegisterData.this.copy$default$10, PersonalityRegisterData.this.copy$default$11)
193 28378 7624 - 7630 Apply java.lang.String.trim org.make.api.user.userservicetest x$4.trim()
193 29592 7591 - 7597 Apply java.lang.String.trim org.make.api.user.userservicetest x$3.trim()
193 30414 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$8 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$8
193 29499 7540 - 7540 Select org.make.api.user.PersonalityRegisterData.copy$default$6 org.make.api.user.userservicetest PersonalityRegisterData.this.copy$default$6
203 28784 7861 - 7920 Apply org.make.api.user.VirtualUserRegisterData.copy VirtualUserRegisterData.this.copy(VirtualUserRegisterData.this.email.trim(), VirtualUserRegisterData.this.firstName.map[String](((x$5: String) => x$5.trim())), VirtualUserRegisterData.this.copy$default$3, VirtualUserRegisterData.this.copy$default$4, VirtualUserRegisterData.this.copy$default$5)
203 29525 7861 - 7861 Select org.make.api.user.VirtualUserRegisterData.copy$default$5 VirtualUserRegisterData.this.copy$default$5
203 30416 7861 - 7861 Select org.make.api.user.VirtualUserRegisterData.copy$default$4 VirtualUserRegisterData.this.copy$default$4
203 29007 7861 - 7861 Select org.make.api.user.VirtualUserRegisterData.copy$default$3 VirtualUserRegisterData.this.copy$default$3
203 28842 7874 - 7884 Apply java.lang.String.trim VirtualUserRegisterData.this.email.trim()
203 29479 7898 - 7919 Apply scala.Option.map VirtualUserRegisterData.this.firstName.map[String](((x$5: String) => x$5.trim()))
203 30283 7912 - 7918 Apply java.lang.String.trim x$5.trim()
213 28308 8164 - 8174 Apply java.lang.String.trim ExternalUserRegisterData.this.email.trim()
213 29402 8151 - 8151 Select org.make.api.user.ExternalUserRegisterData.copy$default$4 ExternalUserRegisterData.this.copy$default$4
213 30451 8151 - 8210 Apply org.make.api.user.ExternalUserRegisterData.copy ExternalUserRegisterData.this.copy(ExternalUserRegisterData.this.email.trim(), ExternalUserRegisterData.this.firstName.map[String](((x$6: String) => x$6.trim())), ExternalUserRegisterData.this.copy$default$3, ExternalUserRegisterData.this.copy$default$4, ExternalUserRegisterData.this.copy$default$5)
213 30200 8151 - 8151 Select org.make.api.user.ExternalUserRegisterData.copy$default$3 ExternalUserRegisterData.this.copy$default$3
213 29016 8151 - 8151 Select org.make.api.user.ExternalUserRegisterData.copy$default$5 ExternalUserRegisterData.this.copy$default$5
213 28848 8188 - 8209 Apply scala.Option.map ExternalUserRegisterData.this.firstName.map[String](((x$6: String) => x$6.trim()))
213 29718 8202 - 8208 Apply java.lang.String.trim x$6.trim()