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.userhistory
21
22 import com.sksamuel.avro4s.{AvroDefault, AvroSortPriority}
23 import org.make.api.user.Anonymization
24 import org.make.core._
25 import org.make.core.question.QuestionId
26 import org.make.core.reference.Country
27 import org.make.core.user.{User, UserId}
28
29 import java.time.ZonedDateTime
30
31 trait UserPersistentEvent {
32 def userId: UserId
33 }
34
35 sealed trait UserEvent extends UserPersistentEvent {
36 def connectedUserId: Option[UserId]
37 def eventDate: ZonedDateTime
38 def requestContext: RequestContext
39 def country: Country
40 def version(): Int
41 def eventId: Option[EventId]
42 }
43
44 object UserEvent {
45
46 val defaultCountry: Country = Country("FR")
47
48 val defaultDate: ZonedDateTime = ZonedDateTime.parse("2017-11-01T09:00:00Z")
49 }
50
51 @AvroSortPriority(19)
52 final case class VoteOnlyTestEvent(
53 override val connectedUserId: Option[UserId] = None,
54 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
55 override val userId: UserId,
56 override val requestContext: RequestContext,
57 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
58 eventId: Option[EventId] = None
59 ) extends UserEvent {
60 override def version(): Int = MakeSerializable.V1
61 }
62
63 @AvroSortPriority(18)
64 final case class VoteOnlyEvent(
65 override val connectedUserId: Option[UserId] = None,
66 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
67 override val userId: UserId,
68 override val requestContext: RequestContext,
69 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
70 eventId: Option[EventId] = None
71 ) extends UserEvent {
72 override def version(): Int = MakeSerializable.V1
73 }
74
75 @AvroSortPriority(17)
76 final case class PersonalityRegisteredEvent(
77 override val connectedUserId: Option[UserId] = None,
78 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
79 override val userId: UserId,
80 override val requestContext: RequestContext,
81 email: String,
82 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
83 eventId: Option[EventId] = None
84 ) extends UserEvent {
85 override def version(): Int = MakeSerializable.V1
86 }
87
88 @AvroSortPriority(16)
89 final case class PersonalityEmailChangedEvent(
90 override val connectedUserId: Option[UserId] = None,
91 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
92 override val userId: UserId,
93 override val requestContext: RequestContext,
94 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
95 oldEmail: String,
96 newEmail: String,
97 eventId: Option[EventId] = None
98 ) extends UserEvent {
99 override def version(): Int = MakeSerializable.V1
100 }
101
102 @AvroSortPriority(15)
103 final case class ResetPasswordEvent(
104 override val connectedUserId: Option[UserId] = None,
105 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
106 override val userId: UserId,
107 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
108 override val requestContext: RequestContext,
109 eventId: Option[EventId] = None
110 ) extends UserEvent {
111 override def version(): Int = MakeSerializable.V1
112 }
113
114 object ResetPasswordEvent {
115 def apply(
116 connectedUserId: Option[UserId],
117 user: User,
118 country: Country,
119 requestContext: RequestContext,
120 eventId: EventId
121 ): ResetPasswordEvent = {
122 ResetPasswordEvent(
123 userId = user.userId,
124 connectedUserId = connectedUserId,
125 country = country,
126 requestContext = requestContext,
127 eventDate = DateHelper.now(),
128 eventId = Some(eventId)
129 )
130 }
131 }
132
133 @AvroSortPriority(14)
134 final case class ResendValidationEmailEvent(
135 override val connectedUserId: Option[UserId] = None,
136 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
137 override val userId: UserId,
138 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
139 override val requestContext: RequestContext,
140 eventId: Option[EventId] = None
141 ) extends UserEvent {
142 override def version(): Int = MakeSerializable.V1
143 }
144
145 object ResendValidationEmailEvent {
146 def apply(
147 connectedUserId: UserId,
148 userId: UserId,
149 country: Country,
150 requestContext: RequestContext,
151 eventId: EventId
152 ): ResendValidationEmailEvent = {
153 ResendValidationEmailEvent(
154 connectedUserId = Some(connectedUserId),
155 eventDate = DateHelper.now(),
156 userId = userId,
157 country = country,
158 requestContext = requestContext,
159 eventId = Some(eventId)
160 )
161 }
162 }
163
164 @AvroSortPriority(13)
165 final case class UserRegisteredEvent(
166 override val connectedUserId: Option[UserId] = None,
167 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
168 override val userId: UserId,
169 override val requestContext: RequestContext,
170 firstName: Option[String],
171 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
172 isSocialLogin: Boolean = false,
173 registerQuestionId: Option[QuestionId] = None,
174 optInPartner: Option[Boolean] = None,
175 eventId: Option[EventId] = None
176 ) extends UserEvent {
177 override def version(): Int = MakeSerializable.V4
178 }
179
180 @AvroSortPriority(12)
181 final case class UserConnectedEvent(
182 override val connectedUserId: Option[UserId] = None,
183 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
184 override val userId: UserId,
185 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
186 override val requestContext: RequestContext,
187 eventId: Option[EventId] = None
188 ) extends UserEvent {
189
190 override def version(): Int = MakeSerializable.V1
191 }
192
193 @AvroSortPriority(10)
194 final case class UserValidatedAccountEvent(
195 override val connectedUserId: Option[UserId] = None,
196 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
197 override val userId: UserId = UserId(value = ""),
198 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
199 override val requestContext: RequestContext = RequestContext.empty,
200 isSocialLogin: Boolean = false,
201 eventId: Option[EventId] = None
202 ) extends UserEvent {
203 override def version(): Int = MakeSerializable.V1
204 }
205
206 @AvroSortPriority(11)
207 final case class UserUpdatedTagEvent(
208 override val connectedUserId: Option[UserId] = None,
209 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
210 override val userId: UserId = UserId(value = ""),
211 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
212 override val requestContext: RequestContext = RequestContext.empty,
213 oldTag: String,
214 newTag: String,
215 eventId: Option[EventId] = None
216 ) extends UserEvent {
217 override def version(): Int = MakeSerializable.V1
218 }
219
220 @AvroSortPriority(9)
221 final case class OrganisationRegisteredEvent(
222 override val connectedUserId: Option[UserId] = None,
223 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
224 override val userId: UserId,
225 override val requestContext: RequestContext,
226 email: String,
227 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
228 eventId: Option[EventId] = None
229 ) extends UserEvent {
230 override def version(): Int = MakeSerializable.V1
231 }
232
233 @AvroSortPriority(8)
234 final case class OrganisationUpdatedEvent(
235 override val connectedUserId: Option[UserId] = None,
236 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
237 override val userId: UserId,
238 override val requestContext: RequestContext,
239 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
240 eventId: Option[EventId] = None
241 ) extends UserEvent {
242 override def version(): Int = MakeSerializable.V1
243 }
244
245 @AvroSortPriority(7)
246 final case class OrganisationInitializationEvent(
247 override val connectedUserId: Option[UserId] = None,
248 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
249 override val userId: UserId,
250 override val requestContext: RequestContext,
251 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
252 eventId: Option[EventId] = None
253 ) extends UserEvent {
254 override def version(): Int = MakeSerializable.V1
255 }
256
257 @AvroSortPriority(6)
258 final case class UserUpdatedOptInNewsletterEvent(
259 override val connectedUserId: Option[UserId] = None,
260 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
261 override val userId: UserId,
262 override val requestContext: RequestContext,
263 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
264 optInNewsletter: Boolean,
265 eventId: Option[EventId] = None
266 ) extends UserEvent {
267 override def version(): Int = MakeSerializable.V1
268 }
269
270 @AvroSortPriority(5)
271 final case class UserAnonymizedEvent(
272 override val connectedUserId: Option[UserId] = None,
273 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
274 override val userId: UserId,
275 override val requestContext: RequestContext,
276 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
277 adminId: UserId,
278 @AvroDefault("automatic") mode: Anonymization = Anonymization.Automatic,
279 eventId: Option[EventId] = None
280 ) extends UserEvent {
281 override def version(): Int = MakeSerializable.V2
282 }
283
284 @AvroSortPriority(4)
285 final case class UserFollowEvent(
286 override val connectedUserId: Option[UserId] = None,
287 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
288 override val userId: UserId,
289 override val requestContext: RequestContext,
290 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
291 followedUserId: UserId,
292 eventId: Option[EventId] = None
293 ) extends UserEvent {
294 override def version(): Int = MakeSerializable.V1
295 }
296
297 @AvroSortPriority(3)
298 final case class UserUnfollowEvent(
299 override val connectedUserId: Option[UserId] = None,
300 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
301 override val userId: UserId,
302 override val requestContext: RequestContext,
303 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
304 unfollowedUserId: UserId,
305 eventId: Option[EventId] = None
306 ) extends UserEvent {
307 override def version(): Int = MakeSerializable.V1
308 }
309
310 @AvroSortPriority(2)
311 final case class UserUploadAvatarEvent(
312 override val connectedUserId: Option[UserId] = None,
313 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
314 override val userId: UserId,
315 override val requestContext: RequestContext,
316 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
317 avatarUrl: String,
318 eventId: Option[EventId] = None
319 ) extends UserEvent {
320 override def version(): Int = MakeSerializable.V1
321 }
322
323 @AvroSortPriority(1)
324 final case class OrganisationEmailChangedEvent(
325 override val connectedUserId: Option[UserId] = None,
326 @AvroDefault("2017-11-01T09:00Z") override val eventDate: ZonedDateTime = UserEvent.defaultDate,
327 override val userId: UserId,
328 override val requestContext: RequestContext,
329 @AvroDefault("FR") override val country: Country = UserEvent.defaultCountry,
330 oldEmail: String,
331 newEmail: String,
332 eventId: Option[EventId] = None
333 ) extends UserEvent {
334 override def version(): Int = MakeSerializable.V1
335 }