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