root / src / main / scala / gr / grnet / aquarium / logic / events / UserEvent.scala @ 564bd9c9
History | View | Annotate | Download (1.9 kB)
1 |
package gr.grnet.aquarium.logic.events |
---|---|
2 |
|
3 |
import gr.grnet.aquarium.util.json.JsonHelpers |
4 |
import net.liftweb.json.{Extraction, parse => parseJson} |
5 |
import gr.grnet.aquarium.MasterConf._ |
6 |
import com.ckkloverdos.maybe.{Failed, NoVal, Just} |
7 |
|
8 |
/** |
9 |
* Represents an incoming user event. |
10 |
* |
11 |
* @author Georgios Gousios <gousiosg@gmail.com> |
12 |
*/ |
13 |
case class UserEvent( |
14 |
override val id: String, |
15 |
override val occurredMillis: Long, |
16 |
var aqTimestamp: Long = 0, |
17 |
userId: String, |
18 |
eventVersion: Short, |
19 |
eventType: Short, //1: create, 2: modify |
20 |
state: String, //ACTIVE, SUSPENDED |
21 |
idp: String, |
22 |
tenant: String, |
23 |
roles: Array[String] |
24 |
) extends AquariumEvent(id, occurredMillis) { |
25 |
|
26 |
assert(eventType == 1 || eventType == 2) |
27 |
assert(state.equalsIgnoreCase("ACTIVE") || |
28 |
state.equalsIgnoreCase("SUSPENDED")) |
29 |
|
30 |
if (eventType == 1) |
31 |
if(!state.equalsIgnoreCase("ACTIVE")) |
32 |
assert(false) |
33 |
|
34 |
/** |
35 |
* Validate this event according to the following rules: |
36 |
* |
37 |
* Valid event states: `(eventType, state)`: |
38 |
* - `a := 1, ACTIVE` |
39 |
* - `b := 2, ACTIVE` |
40 |
* - `c := 2, SUSPENDED` |
41 |
* |
42 |
* Valid transitions: |
43 |
* - `(non-existent) -> a` |
44 |
* - `a -> c` |
45 |
* - `c -> b` |
46 |
*/ |
47 |
def validate: Boolean = { |
48 |
|
49 |
MasterConf.userStore.findUserStateByUserId(userId) match { |
50 |
case Just(x) => |
51 |
if (eventType == 1){ |
52 |
logger.warn("User to create exists: IMEvent".format(this.toJson)); |
53 |
return false |
54 |
} |
55 |
case NoVal => |
56 |
if (eventType != 2){ |
57 |
logger.warn("Inexistent user to modify. IMEvent:".format(this.toJson)) |
58 |
return false |
59 |
} |
60 |
case Failed(x,y) => |
61 |
logger.warn("Error retrieving user state: %s".format(x)) |
62 |
} |
63 |
|
64 |
true |
65 |
} |
66 |
} |
67 |
|
68 |
object UserEvent { |
69 |
def fromJson(json: String): ResourceEvent = { |
70 |
implicit val formats = JsonHelpers.DefaultJsonFormats |
71 |
val jsonAST = parseJson(json) |
72 |
Extraction.extract[ResourceEvent](jsonAST) |
73 |
} |
74 |
} |