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  }