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  }