github.com/vmware/transport-go@v1.3.4/examples/need-refactoring/sample_services.go (about) 1 // Copyright 2019-2020 VMware, Inc. 2 // SPDX-License-Identifier: BSD-2-Clause 3 4 package need_refactoring 5 6 import ( 7 "fmt" 8 "github.com/google/uuid" 9 "github.com/vmware/transport-go/model" 10 "github.com/vmware/transport-go/service" 11 "reflect" 12 "time" 13 ) 14 15 const ( 16 CalendarServiceChan = "calendar-service" 17 PongServiceChan = "services-PongService" 18 SimpleStreamChan = "simple-stream" 19 ServbotServiceChan = "servbot" 20 VmServiceChan = "vm-service" 21 VMWCloudServiceChan = "services-CloudServiceStatus" 22 ) 23 24 type calendarService struct{} 25 26 func (cs *calendarService) HandleServiceRequest( 27 request *model.Request, core service.FabricServiceCore) { 28 29 switch request.Request { 30 case "time": 31 core.SendResponse(request, time.Now().Format("03:04:05.000 AM (-0700)")) 32 case "date": 33 core.SendResponse(request, time.Now().Format("Mon, 02 Jan 2006")) 34 default: 35 core.HandleUnknownRequest(request) 36 } 37 } 38 39 type pongService struct{} 40 41 func (cs *pongService) HandleServiceRequest( 42 request *model.Request, core service.FabricServiceCore) { 43 44 switch request.Request { 45 case "basic": 46 core.SendResponse(request, "Fabric Pong (Basic): Pong: "+request.Payload.(string)) 47 case "full": 48 id := uuid.New() 49 tr := core.Bus().CreateAsyncTransaction() 50 tr.SendRequest(CalendarServiceChan, &model.Request{Id: &id, Request: "date"}) 51 tr.SendRequest(CalendarServiceChan, &model.Request{Id: &id, Request: "time"}) 52 tr.OnComplete(func(responses []*model.Message) { 53 core.SendResponse(request, fmt.Sprintf("Fabric Pong (Full): Calendar: %s %s / Pong: %s", 54 responses[0].Payload.(*model.Response).Payload, 55 responses[1].Payload.(*model.Response).Payload, 56 request.Payload)) 57 }) 58 tr.Commit() 59 default: 60 core.HandleUnknownRequest(request) 61 } 62 } 63 64 type simpleStreamTickerService struct { 65 online bool 66 } 67 68 func (fs *simpleStreamTickerService) HandleServiceRequest(request *model.Request, core service.FabricServiceCore) { 69 switch request.Request { 70 case "online": 71 fs.online = true 72 case "offline": 73 fs.online = false 74 default: 75 core.HandleUnknownRequest(request) 76 } 77 } 78 79 func (fs *simpleStreamTickerService) Init(core service.FabricServiceCore) error { 80 fs.online = true 81 ticker := time.NewTicker(500 * time.Millisecond) 82 go func() { 83 for { 84 <-ticker.C 85 if fs.online { 86 now := time.Now() 87 id := uuid.New() 88 response := &model.Response{ 89 Payload: fmt.Sprintf("ping-%d", now.Nanosecond()+now.Second()), 90 Id: &id, 91 } 92 core.Bus().SendResponseMessage(SimpleStreamChan, response, nil) 93 } 94 } 95 }() 96 return nil 97 } 98 99 type Joke struct { 100 Id string `json:"id"` 101 Joke string `json:"joke"` 102 Status int `json:"status"` 103 } 104 105 type servbotService struct{} 106 107 func (s *servbotService) Init(core service.FabricServiceCore) error { 108 core.SetHeaders(map[string]string{ 109 "Accept": "application/json", 110 }) 111 return nil 112 } 113 114 func (s *servbotService) HandleServiceRequest( 115 request *model.Request, core service.FabricServiceCore) { 116 117 switch request.Request { 118 case "Joke": 119 core.RestServiceRequest(&service.RestServiceRequest{ 120 Uri: "https://icanhazdadjoke.com", 121 Method: "GET", 122 ResponseType: reflect.TypeOf(&Joke{}), 123 }, func(response *model.Response) { 124 core.SendResponse(request, []string{response.Payload.(*Joke).Joke}) 125 }, func(response *model.Response) { 126 core.SendErrorResponse(request, response.ErrorCode, response.ErrorMessage) 127 }) 128 default: 129 core.HandleUnknownRequest(request) 130 } 131 } 132 133 type vmwCloudServiceService struct{} 134 135 func (s *vmwCloudServiceService) HandleServiceRequest( 136 request *model.Request, core service.FabricServiceCore) { 137 138 core.RestServiceRequest(&service.RestServiceRequest{ 139 Uri: "https://status.vmware-services.io/api/v2/status.json", 140 Method: "GET", 141 }, func(response *model.Response) { 142 core.SendResponse(request, response.Payload) 143 }, func(response *model.Response) { 144 core.SendErrorResponse(request, response.ErrorCode, response.ErrorMessage) 145 }) 146 }