payload.go RawHistoryFolder
1package common
2
3import (
4 "encoding/json"
5 "fmt"
6
7 "io"
8)
9
10type RequestPayload struct {
11 Type string `json:"type"`
12 Payload Payload `json:"payload"`
13}
14
15type Payload interface {
16 GetType() string
17}
18
19type DeployResponse struct {
20 Success bool `json:"success"`
21 Message string `json:"message"`
22 Domain string `json:"domain,omitempty"`
23}
24
25type PushResponse struct {
26 Success bool `json:"success"`
27 Message string `json:"message"`
28 CreateContainerURL string `json:"create_container_url,omitempty"`
29}
30
31type DeploymentError struct {
32 StatusCode int `json:"status_code"`
33 Message string `json:"message"`
34 RawResponse string `json:"raw_response"`
35}
36
37func (e *DeploymentError) Error() string {
38 return fmt.Sprintf("Deployment failed (status %d): %s", e.StatusCode, e.Message)
39}
40
41type DeployPayload struct {
42 Port string `json:"port"`
43 TargetDomain string `json:"targetdomain"`
44 ImageName string `json:"imagename"`
45 ImageID string `json:"imageid"`
46 Data io.ReadCloser
47}
48
49type PushPayload struct {
50 ImageName string `json:"imagename"`
51 ImageID string `json:"imageid"`
52 Data io.ReadCloser
53}
54
55func (p *RequestPayload) UnmarshalJSON(data []byte) error {
56 var raw map[string]json.RawMessage
57 err := json.Unmarshal(data, &raw)
58 if err != nil {
59 return err
60 }
61
62 if err := json.Unmarshal(raw["type"], &p.Type); err != nil {
63 return err
64 }
65
66 switch p.Type {
67 case "ping":
68 var payload PingPayload
69 if err := json.Unmarshal(raw["payload"], &payload); err != nil {
70 return err
71 }
72 p.Payload = payload
73 case "deploy":
74 var payload DeployPayload
75 if err := json.Unmarshal(raw["payload"], &payload); err != nil {
76 return err
77 }
78 p.Payload = payload
79 case "push":
80 var payload PushPayload
81 if err := json.Unmarshal(raw["payload"], &payload); err != nil {
82 return err
83 }
84 p.Payload = payload
85 default:
86 return fmt.Errorf("invalid type: %s", p.Type)
87 }
88
89 return nil
90}
91
92type PingPayload struct {
93 Message string `json:"message"`
94}
95
96func (p PingPayload) GetType() string {
97 return "ping"
98}
99
100func (p DeployPayload) GetType() string {
101 return "deploy"
102}
103
104func (p PushPayload) GetType() string {
105 return "push"
106}
107
108func NewPingPayload(data map[string]interface{}) (PingPayload, error) {
109 message, ok := data["message"].(string)
110 if !ok {
111 return PingPayload{}, fmt.Errorf("invalid data for message")
112 }
113 return PingPayload{Message: message}, nil
114}