in frontend/pkg/frontend/frontend.go [913:988]
func (f *Frontend) ArmSubscriptionPut(writer http.ResponseWriter, request *http.Request) {
ctx := request.Context()
logger := LoggerFromContext(ctx)
body, err := BodyFromContext(ctx)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
var subscription arm.Subscription
err = json.Unmarshal(body, &subscription)
if err != nil {
logger.Error(err.Error())
arm.WriteInvalidRequestContentError(writer, err)
return
}
cloudError := api.ValidateSubscription(&subscription)
if cloudError != nil {
logger.Error(cloudError.Error())
arm.WriteCloudError(writer, cloudError)
return
}
subscriptionID := request.PathValue(PathSegmentSubscriptionID)
_, err = f.dbClient.GetSubscriptionDoc(ctx, subscriptionID)
if errors.Is(err, database.ErrNotFound) {
err = f.dbClient.CreateSubscriptionDoc(ctx, subscriptionID, &subscription)
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
logger.Info(fmt.Sprintf("created document for subscription %s", subscriptionID))
} else if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
} else {
updated, err := f.dbClient.UpdateSubscriptionDoc(ctx, subscriptionID, func(updateSubscription *arm.Subscription) bool {
messages := getSubscriptionDifferences(updateSubscription, &subscription)
for _, message := range messages {
logger.Info(message)
}
*updateSubscription = subscription
return len(messages) > 0
})
if err != nil {
logger.Error(err.Error())
arm.WriteInternalServerError(writer)
return
}
if updated {
logger.Info(fmt.Sprintf("updated document for subscription %s", subscriptionID))
}
}
// Clean up resources if subscription is deleted.
if subscription.State == arm.SubscriptionStateDeleted {
cloudError := f.DeleteAllResources(ctx, subscriptionID)
if cloudError != nil {
arm.WriteCloudError(writer, cloudError)
return
}
}
_, err = arm.WriteJSONResponse(writer, http.StatusOK, subscription)
if err != nil {
logger.Error(err.Error())
}
}