Ctrl K
ComunidadGuías…

coderd/httpapi/chatlabels.go

Rama main · réplica de lectura del repositorio original.

Archivo original ↗Preguntar a KiBot
package httpapi

import (
	"fmt"
	"regexp"

	"github.com/coder/coder/v2/codersdk"
)

const (
	// maxLabelsPerChat is the maximum number of labels allowed on a
	// single chat.
	maxLabelsPerChat = 50
	// maxLabelKeyLength is the maximum length of a label key in bytes.
	maxLabelKeyLength = 64
	// maxLabelValueLength is the maximum length of a label value in
	// bytes.
	maxLabelValueLength = 256
)

// labelKeyRegex validates that a label key starts with an alphanumeric
// character and is followed by alphanumeric characters, dots, hyphens,
// underscores, or forward slashes.
var labelKeyRegex = regexp.MustCompile(`^[a-zA-Z0-9][a-zA-Z0-9._/-]*$`)

// ValidateChatLabels checks that the provided labels map conforms to the
// labeling constraints for chats. It returns a list of validation
// errors, one per violated constraint.
func ValidateChatLabels(labels map[string]string) []codersdk.ValidationError {
	var errs []codersdk.ValidationError

	if len(labels) > maxLabelsPerChat {
		errs = append(errs, codersdk.ValidationError{
			Field:  "labels",
			Detail: fmt.Sprintf("too many labels (%d); maximum is %d", len(labels), maxLabelsPerChat),
		})
	}

	for k, v := range labels {
		if k == "" {
			errs = append(errs, codersdk.ValidationError{
				Field:  "labels",
				Detail: "label key must not be empty",
			})
			continue
		}

		if len(k) > maxLabelKeyLength {
			errs = append(errs, codersdk.ValidationError{
				Field:  "labels",
				Detail: fmt.Sprintf("label key %q exceeds maximum length of %d bytes", k, maxLabelKeyLength),
			})
		}

		if !labelKeyRegex.MatchString(k) {
			errs = append(errs, codersdk.ValidationError{
				Field:  "labels",
				Detail: fmt.Sprintf("label key %q contains invalid characters; must match %s", k, labelKeyRegex.String()),
			})
		}

		if v == "" {
			errs = append(errs, codersdk.ValidationError{
				Field:  "labels",
				Detail: fmt.Sprintf("label value for key %q must not be empty", k),
			})
		}

		if len(v) > maxLabelValueLength {
			errs = append(errs, codersdk.ValidationError{
				Field:  "labels",
				Detail: fmt.Sprintf("label value for key %q exceeds maximum length of %d bytes", k, maxLabelValueLength),
			})
		}
	}

	return errs
}