Added Target and Terminal events through WS.
[src/xds/xds-server.git] / lib / xsapiv1 / events.go
index e19eb82..e42563c 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright (C) 2017 "IoT.bzh"
+ * Copyright (C) 2017-2018 "IoT.bzh"
  * Author Sebastien Douheret <sebastien@iot.bzh>
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
 
 package xsapiv1
 
+import (
+       "encoding/json"
+       "fmt"
+)
+
 // EventRegisterArgs Parameters (json format) of /events/register command
 type EventRegisterArgs struct {
-       Name      string `json:"name"`
-       ProjectID string `json:"filterProjectID"`
+       Name   string `json:"name"`
+       Filter string `json:"filter"`
 }
 
 // EventUnRegisterArgs Parameters of /events/unregister command
@@ -31,9 +36,10 @@ type EventUnRegisterArgs struct {
 
 // EventMsg Message send
 type EventMsg struct {
-       Time   string       `json:"time"`
-       Type   string       `json:"type"`
-       Folder FolderConfig `json:"folder"`
+       Time          string      `json:"time"`
+       FromSessionID string      `json:"sessionID"` // Session ID of client who produce this event
+       Type          string      `json:"type"`
+       Data          interface{} `json:"data"` // Data
 }
 
 // EventEvent Event send in WS when an internal event (eg. Syncthing event is received)
@@ -42,7 +48,105 @@ const (
        EventTypePrefix = "event:" // following by event type
 
        // Supported Events type
-       EVTAll               = EventTypePrefix + "all"
-       EVTFolderChange      = EventTypePrefix + "folder-change"       // type EventMsg with Data type xsapiv1.???
-       EVTFolderStateChange = EventTypePrefix + "folder-state-change" // type EventMsg with Data type xsapiv1.???
+       EVTAll = EventTypePrefix + "all"
+
+       EVTFolderChange      = EventTypePrefix + "folder-change"       // type EventMsg with Data type xsapiv1.FolderConfig
+       EVTFolderStateChange = EventTypePrefix + "folder-state-change" // type EventMsg with Data type xsapiv1.FolderConfig
+
+       EVTSDKAdd         = EventTypePrefix + "sdk-add"          // type EventMsg with Data type xsapiv1.SDK
+       EVTSDKRemove      = EventTypePrefix + "sdk-remove"       // type EventMsg with Data type xsapiv1.SDK
+       EVTSDKManagement  = EventTypePrefix + "sdk-management"   // type EventMsg with Data type xsapiv1.SDKManagementMsg
+       EVTSDKStateChange = EventTypePrefix + "sdk-state-change" // type EventMsg with Data type xsapiv1.SDK
+
+       EVTTargetAdd         = EventTypePrefix + "target-add"          // type EventMsg with Data type xsapiv1.TargetConfig
+       EVTTargetRemove      = EventTypePrefix + "target-remove"       // type EventMsg with Data type xsapiv1.TargetConfig
+       EVTTargetStateChange = EventTypePrefix + "target-state-change" // type EventMsg with Data type xsapiv1.TargetConfig
+
+       EVTTargetTerminalAdd         = EventTypePrefix + "target-terminal-add"          // type EventMsg with Data type xsapiv1.TerminalConfig
+       EVTTargetTerminalRemove      = EventTypePrefix + "target-terminal-remove"       // type EventMsg with Data type xsapiv1.TerminalConfig
+       EVTTargetTerminalStateChange = EventTypePrefix + "target-terminal-state-change" // type EventMsg with Data type xsapiv1.TerminalConfig
 )
+
+// EVTAllList List of all supported events
+var EVTAllList = []string{
+       EVTFolderChange,
+       EVTFolderStateChange,
+       EVTSDKAdd,
+       EVTSDKRemove,
+       EVTSDKManagement,
+       EVTSDKStateChange,
+       EVTTargetAdd,
+       EVTTargetRemove,
+       EVTTargetStateChange,
+       EVTTargetTerminalAdd,
+       EVTTargetTerminalRemove,
+       EVTTargetTerminalStateChange,
+}
+
+// DecodeFolderConfig Helper to decode Data field type FolderConfig
+func (e *EventMsg) DecodeFolderConfig() (FolderConfig, error) {
+       var err error
+       f := FolderConfig{}
+       switch e.Type {
+       case EVTFolderChange, EVTFolderStateChange:
+               d := []byte{}
+               d, err = json.Marshal(e.Data)
+               if err == nil {
+                       err = json.Unmarshal(d, &f)
+               }
+       default:
+               err = fmt.Errorf("Invalid type")
+       }
+       return f, err
+}
+
+// DecodeSDKEvent Helper to decode Data field type SDK
+func (e *EventMsg) DecodeSDKEvent() (SDK, error) {
+       var err error
+       s := SDK{}
+       switch e.Type {
+       case EVTSDKAdd, EVTSDKRemove, EVTSDKStateChange:
+               d := []byte{}
+               d, err = json.Marshal(e.Data)
+               if err == nil {
+                       err = json.Unmarshal(d, &s)
+               }
+       default:
+               err = fmt.Errorf("Invalid type")
+       }
+       return s, err
+}
+
+// DecodeTargetEvent Helper to decode Data field type TargetConfig
+func (e *EventMsg) DecodeTargetEvent() (TargetConfig, error) {
+       var err error
+       p := TargetConfig{}
+       switch e.Type {
+       case EVTTargetAdd, EVTTargetRemove, EVTTargetStateChange:
+               d := []byte{}
+               d, err = json.Marshal(e.Data)
+               if err == nil {
+                       err = json.Unmarshal(d, &p)
+               }
+       default:
+               err = fmt.Errorf("Invalid type")
+       }
+       return p, err
+}
+
+// DecodeTerminalEvent Helper to decode Data field type TerminalConfig
+func (e *EventMsg) DecodeTerminalEvent() (TerminalConfig, error) {
+       var err error
+       p := TerminalConfig{}
+       switch e.Type {
+       case EVTTargetTerminalAdd, EVTTargetTerminalRemove, EVTTargetTerminalStateChange:
+               d := []byte{}
+               d, err = json.Marshal(e.Data)
+               if err == nil {
+                       err = json.Unmarshal(d, &p)
+               }
+       default:
+               err = fmt.Errorf("Invalid type")
+       }
+       return p, err
+}