dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts@v1.0.2/dtos/requests/subscription.go (about) 1 // 2 // Copyright (C) 2020-2021 IOTech Ltd 3 // 4 // SPDX-License-Identifier: Apache-2.0 5 6 package requests 7 8 import ( 9 "encoding/json" 10 11 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/common" 12 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos" 13 dtoCommon "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/dtos/common" 14 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/errors" 15 "dev.azure.com/aidainnovazione0090/DeviceManager/_git/go-mod-core-contracts/models" 16 ) 17 18 var supportedChannelTypes = []string{common.EMAIL, common.REST} 19 20 // AddSubscriptionRequest defines the Request Content for POST Subscription DTO. 21 type AddSubscriptionRequest struct { 22 dtoCommon.BaseRequest `json:",inline"` 23 Subscription dtos.Subscription `json:"subscription"` 24 } 25 26 // Validate satisfies the Validator interface 27 func (request AddSubscriptionRequest) Validate() error { 28 err := common.Validate(request) 29 if err != nil { 30 return errors.NewCommonEdgeXWrapper(err) 31 } 32 for _, c := range request.Subscription.Channels { 33 err = c.Validate() 34 if err != nil { 35 return errors.NewCommonEdgeXWrapper(err) 36 } else if !contains(supportedChannelTypes, c.Type) { 37 return errors.NewCommonEdgeX(errors.KindContractInvalid, "MQTT is not valid type for Channel", nil) 38 } 39 } 40 return nil 41 } 42 43 // UnmarshalJSON implements the Unmarshaler interface for the AddSubscriptionRequest type 44 func (request *AddSubscriptionRequest) UnmarshalJSON(b []byte) error { 45 var alias struct { 46 dtoCommon.BaseRequest 47 Subscription dtos.Subscription 48 } 49 if err := json.Unmarshal(b, &alias); err != nil { 50 return errors.NewCommonEdgeX(errors.KindContractInvalid, "Failed to unmarshal request body as JSON.", err) 51 } 52 53 *request = AddSubscriptionRequest(alias) 54 55 // validate AddSubscriptionRequest DTO 56 if err := request.Validate(); err != nil { 57 return errors.NewCommonEdgeXWrapper(err) 58 } 59 return nil 60 } 61 62 // AddSubscriptionReqToSubscriptionModels transforms the AddSubscriptionRequest DTO array to the AddSubscriptionRequest model array 63 func AddSubscriptionReqToSubscriptionModels(reqs []AddSubscriptionRequest) (s []models.Subscription) { 64 for _, req := range reqs { 65 d := dtos.ToSubscriptionModel(req.Subscription) 66 s = append(s, d) 67 } 68 return s 69 } 70 71 // UpdateSubscriptionRequest defines the Request Content for PUT event as pushed DTO. 72 type UpdateSubscriptionRequest struct { 73 dtoCommon.BaseRequest `json:",inline"` 74 Subscription dtos.UpdateSubscription `json:"subscription"` 75 } 76 77 // Validate satisfies the Validator interface 78 func (request UpdateSubscriptionRequest) Validate() error { 79 err := common.Validate(request) 80 if err != nil { 81 return errors.NewCommonEdgeXWrapper(err) 82 } 83 for _, c := range request.Subscription.Channels { 84 err = c.Validate() 85 if err != nil { 86 return errors.NewCommonEdgeXWrapper(err) 87 } else if !contains(supportedChannelTypes, c.Type) { 88 return errors.NewCommonEdgeX(errors.KindContractInvalid, "MQTT is not valid type for Channel", nil) 89 } 90 } 91 if request.Subscription.Categories != nil && request.Subscription.Labels != nil && 92 len(request.Subscription.Categories) == 0 && len(request.Subscription.Labels) == 0 { 93 return errors.NewCommonEdgeX(errors.KindContractInvalid, "categories and labels can not be both empty", nil) 94 } 95 return nil 96 } 97 98 // UnmarshalJSON implements the Unmarshaler interface for the UpdateSubscriptionRequest type 99 func (request *UpdateSubscriptionRequest) UnmarshalJSON(b []byte) error { 100 var alias struct { 101 dtoCommon.BaseRequest 102 Subscription dtos.UpdateSubscription 103 } 104 if err := json.Unmarshal(b, &alias); err != nil { 105 return errors.NewCommonEdgeX(errors.KindContractInvalid, "Failed to unmarshal request body as JSON.", err) 106 } 107 108 *request = UpdateSubscriptionRequest(alias) 109 110 // validate UpdateSubscriptionRequest DTO 111 if err := request.Validate(); err != nil { 112 return errors.NewCommonEdgeXWrapper(err) 113 } 114 return nil 115 } 116 117 // ReplaceSubscriptionModelFieldsWithDTO replace existing Subscription's fields with DTO patch 118 func ReplaceSubscriptionModelFieldsWithDTO(s *models.Subscription, patch dtos.UpdateSubscription) { 119 if patch.Channels != nil { 120 s.Channels = dtos.ToAddressModels(patch.Channels) 121 } 122 if patch.Categories != nil { 123 s.Categories = patch.Categories 124 } 125 if patch.Labels != nil { 126 s.Labels = patch.Labels 127 } 128 if patch.Description != nil { 129 s.Description = *patch.Description 130 } 131 if patch.Receiver != nil { 132 s.Receiver = *patch.Receiver 133 } 134 if patch.ResendLimit != nil { 135 s.ResendLimit = *patch.ResendLimit 136 } 137 if patch.ResendInterval != nil { 138 s.ResendInterval = *patch.ResendInterval 139 } 140 if patch.AdminState != nil { 141 s.AdminState = models.AdminState(*patch.AdminState) 142 } 143 } 144 145 func NewAddSubscriptionRequest(dto dtos.Subscription) AddSubscriptionRequest { 146 return AddSubscriptionRequest{ 147 BaseRequest: dtoCommon.NewBaseRequest(), 148 Subscription: dto, 149 } 150 } 151 152 func NewUpdateSubscriptionRequest(dto dtos.UpdateSubscription) UpdateSubscriptionRequest { 153 return UpdateSubscriptionRequest{ 154 BaseRequest: dtoCommon.NewBaseRequest(), 155 Subscription: dto, 156 } 157 } 158 159 func contains(s []string, str string) bool { 160 for _, v := range s { 161 if v == str { 162 return true 163 } 164 } 165 return false 166 }