Merge: Mock Github API tests
[nit.git] / contrib / nitrpg / src / events.nit
index dde2c55..08d387d 100644 (file)
@@ -24,8 +24,11 @@ import game
 
 redef class GameEntity
 
-       # Saves `event` in `self`.
-       fun add_event(event: GameEvent) do event.save_in(self.key)
+       # Register a new game event for this entity.
+       fun add_event(event: GameEvent) do
+               event.owner = self
+               event.save
+       end
 
        # List all events registered in this entity.
        #
@@ -33,13 +36,12 @@ redef class GameEntity
        #
        # To add events see `add_event`.
        fun load_events: Array[GameEvent] do
-               var key = key / "events"
+               var req = new JsonObject
+               req["game"] = game.key
+               req["owner"] = key
                var res = new Array[GameEvent]
-               if not game.store.has_collection(key) then return res
-               var coll = game.store.list_collection(key)
-               for id in coll do
-                       var name = id.to_s
-                       res.add load_event(name).as(not null)
+               for obj in game.db.collection("events").find_all(req) do
+                       res.add new GameEvent.from_json(game, obj)
                end
                (new EventTimeComparator).sort(res)
                return res
@@ -50,10 +52,13 @@ redef class GameEntity
        # Looks for the event save file in game data.
        # Returns `null` if the event cannot be found.
        fun load_event(id: String): nullable GameEvent do
-               var key = key / "events" / id
-               if not game.store.has_key(key) then return null
-               var json = game.store.load_object(key)
-               return new GameEvent.from_json(game, json)
+               var req = new JsonObject
+               req["game"] = game.key
+               req["owner"] = key
+               req["internal_id"] = id
+               var res = game.db.collection("events").find(req)
+               if res != null then return new GameEvent.from_json(game, res)
+               return null
        end
 end
 
@@ -61,10 +66,13 @@ end
 class GameEvent
        super GameEntity
 
-       redef var key is lazy do return "events" / internal_id
+       redef var collection_name = "events"
 
        redef var game
 
+       # Entity this event belongs to.
+       var owner: nullable GameEntity = null
+
        # String used to dissociate events in the display.
        var kind: String
 
@@ -76,6 +84,8 @@ class GameEvent
        # GameEvent uniq id used for storage.
        var internal_id: String is noinit
 
+       redef var key = internal_id is lazy
+
        # Date and time of the event.
        var time: ISODate is noinit, writable
 
@@ -89,19 +99,20 @@ class GameEvent
        #
        # Used to load events from json storage.
        init from_json(game: Game, json: JsonObject) do
-               self.game = game
-               internal_id = json["internal_id"].to_s
-               kind = json["kind"].to_s
-               time = new ISODate.from_string(json["time"].to_s)
-               data = json["data"].as(JsonObject)
+               init(game, json["kind"].as(String), json["data"].as(JsonObject))
+               internal_id = json["internal_id"].as(String)
+               time = new ISODate.from_string(json["time"].as(String))
        end
 
-       redef fun to_json do
+       redef fun to_json_object do
                var json = new JsonObject
                json["internal_id"] = internal_id.to_s
                json["kind"] = kind
                json["time"] = time.to_s
                json["data"] = data
+               json["game"] = game.key
+               var owner = self.owner
+               if owner != null then json["owner"] = owner.key
                return json
        end
 end