MCPcopy Index your code
hub / github.com/coder/coder / patchTemplateMeta

Method patchTemplateMeta

coderd/templates.go:653–858  ·  view source on GitHub ↗

@Summary Update template settings by ID @ID update-template-settings-by-id @Security CoderSessionToken @Accept json @Produce json @Tags Templates @Param template path string true "Template ID" format(uuid) @Param request body codersdk.UpdateTemplateMeta true "Patch template settings request" @Succes

(rw http.ResponseWriter, r *http.Request)

Source from the content-addressed store, hash-verified

651// @Success 200 {object} codersdk.Template
652// @Router /api/v2/templates/{template} [patch]
653func (api *API) patchTemplateMeta(rw http.ResponseWriter, r *http.Request) {
654 var (
655 ctx = r.Context()
656 template = httpmw.TemplateParam(r)
657 auditor = *api.Auditor.Load()
658 portSharer = *api.PortSharer.Load()
659 aReq, commitAudit = audit.InitRequest[database.Template](rw, &audit.RequestParams{
660 Audit: auditor,
661 Log: api.Logger,
662 Request: r,
663 Action: database.AuditActionWrite,
664 OrganizationID: template.OrganizationID,
665 })
666 )
667 defer commitAudit()
668 aReq.Old = template
669
670 scheduleOpts, err := (*api.TemplateScheduleStore.Load()).Get(ctx, api.Database, template.ID)
671 if err != nil {
672 httpapi.Write(ctx, rw, http.StatusInternalServerError, codersdk.Response{
673 Message: "Internal error fetching template schedule options.",
674 Detail: err.Error(),
675 })
676 return
677 }
678
679 var req codersdk.UpdateTemplateMeta
680 if !httpapi.Read(ctx, rw, r, &req) {
681 return
682 }
683
684 // resolveTemplateMetaUpdate falls back to the existing template's
685 // values for any pointer field that is nil in the request, so that
686 // omitted fields are preserved instead of being overwritten with
687 // Go zero values.
688 resolved, validErrs := resolveTemplateMetaUpdate(template, scheduleOpts, req)
689
690 if resolved.defaultTTLMillis < 0 {
691 validErrs = append(validErrs, codersdk.ValidationError{Field: "default_ttl_ms", Detail: "Must be a positive integer."})
692 }
693 if resolved.activityBumpMillis < 0 {
694 validErrs = append(validErrs, codersdk.ValidationError{Field: "activity_bump_ms", Detail: "Must be a positive integer."})
695 }
696 if resolved.autostopRequirementWeeks > schedule.MaxTemplateAutostopRequirementWeeks {
697 validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: fmt.Sprintf("Must be less than %d.", schedule.MaxTemplateAutostopRequirementWeeks)})
698 }
699 // AutostopRequirement.Weeks is allowed to be negative on input but is
700 // surfaced as a validation error. resolveTemplateMetaUpdate normalizes
701 // 0 -> 1 but preserves negatives so the caller can reject them.
702 if req.AutostopRequirement != nil && req.AutostopRequirement.Weeks < 0 {
703 validErrs = append(validErrs, codersdk.ValidationError{Field: "autostop_requirement.weeks", Detail: "Must be a positive integer."})
704 }
705 if template.AutostopRequirementWeeks <= 0 {
706 template.AutostopRequirementWeeks = defaultRequirementWeeks
707 }
708
709 // The minimum valid value for a dormant TTL is 1 minute. This is
710 // to ensure an uninformed user does not send an unintentionally

Callers

nothing calls this directly

Calls 15

convertTemplateMethod · 0.95
TemplateParamFunction · 0.92
InitRequestFunction · 0.92
WriteFunction · 0.92
ReadFunction · 0.92
AppSharingLevelTypeAlias · 0.92
NowFunction · 0.92
IsUniqueViolationFunction · 0.92
InternalServerErrorFunction · 0.92
DurationMethod · 0.80

Tested by

no test coverage detected