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