Files
upstream-corteza/server/pkg/envoy/resource/resource.go
upstream-mirror 7e385fc126
Some checks failed
SonarQube / SonarQube (push) Failing after 5m28s
E2e test on main branch push / server and client test (map[name:admin port:8080]) (push) Failing after 3m33s
Server and lib tests / Library test (js) (push) Failing after 1m36s
Server and lib tests / Library test (vue) (push) Successful in 2m24s
Server and lib tests / Web client test (admin) (push) Successful in 2m52s
Server and lib tests / Web client test (compose) (push) Successful in 3m23s
Server and lib tests / Web client test (discovery) (push) Successful in 2m49s
Server and lib tests / Web client test (one) (push) Successful in 2m52s
Server and lib tests / Web client test (privacy) (push) Successful in 2m44s
Server and lib tests / Web client test (reporter) (push) Successful in 2m56s
Server and lib tests / Web client test (workflow) (push) Successful in 3m0s
Server and lib tests / Server tests (push) Failing after 4m55s
E2e test on main branch push / notify-failure (push) Failing after 9s
Server and lib tests / Send matrix testing notification (push) Successful in 2s
Mark stale issues and pull requests / stale (push) Successful in 40s
snapshot of https://github.com/cortezaproject/corteza.git (2024.9.x, 2026-09-18; blobs > 131072B omitted)
2026-09-18 01:22:23 +05:00

233 lines
4.5 KiB
Go

package resource
import (
"fmt"
"strconv"
composeTypes "github.com/cortezaproject/corteza/server/compose/types"
"github.com/cortezaproject/corteza/server/system/types"
)
type (
base struct {
rt string
ii Identifiers
rr RefSet
ph bool
ts *Timestamps
us *Userstamps
cfg *EnvoyConfig
urefs RefSet
}
EnvoyConfig struct {
// SkipIf determines when the encoding should be skipped for this resource
SkipIf string
OnExisting MergeAlg
}
MergeAlg int
)
const (
// Default takes the operation defined default
Default MergeAlg = iota
// Skip skips the existing resource
Skip
// Replace replaces the existing resource
Replace
// MergeLeft updates the existing resource, giving priority to the existing data
MergeLeft
// MergeRight updates the existing resource, giving priority to the new data
MergeRight
)
// fn converts identifier values (string, fmt.Stringer, uint64) to string slice
//
// Each value is checked and should not be empty or zero
func identifiers(ii ...interface{}) []string {
ss := make([]string, 0, len(ii))
for _, i := range ii {
switch c := i.(type) {
case uint64:
if c == 0 {
continue
}
ss = append(ss, strconv.FormatUint(c, 10))
case fmt.Stringer:
if c.String() == "" {
continue
}
ss = append(ss, c.String())
case string:
if c == "" {
continue
}
ss = append(ss, c)
}
}
return ss
}
// Check checks if the identifier c is in the set of identifiers ii
func Check(a string, ii ...interface{}) bool {
for _, i := range ii {
switch pi := i.(type) {
case string:
if a == pi {
return true
}
case uint64:
if pi > 0 && strconv.FormatUint(pi, 10) == i {
return true
}
}
}
return false
}
// AddIdentifier adds a set of identifiers to the current resource
func (t *base) AddIdentifier(ss ...string) {
t.ii = t.ii.Add(ss...)
}
// SetIdentifier sets the identifiers to whatever was provided
func (t *base) SetIdentifier(ii Identifiers) {
t.ii = ii
}
// AddRef adds a new reference to the current resource
func (t *base) AddRef(rt string, ii ...string) *Ref {
iiC := make([]string, 0, len(ii))
for _, i := range ii {
if i != "" {
iiC = append(iiC, i)
}
}
return t.addRef(&Ref{ResourceType: rt, Identifiers: Identifiers{}.Add(iiC...)})
}
func (t *base) addRef(r *Ref) *Ref {
t.rr = append(t.rr, r)
return r
}
// ReplaceRef replaces the given ref with the new one.
// The new ref is added regardles if the old one exists or not.
func (t *base) ReplaceRef(old, new *Ref) {
t.rr = t.rr.replaceRef(old, new)
}
// SetResourceType sets the resource type of the current resource struct
func (t *base) SetResourceType(rt string) {
t.rt = rt
}
func (t *base) SetTimestamps(ts *Timestamps) {
t.ts = ts
}
func (t *base) Timestamps() *Timestamps {
return t.ts
}
func (t *base) SetUserstamps(us *Userstamps) {
t.us = us
if us != nil {
uu := []*Userstamp{us.CreatedBy, us.UpdatedBy, us.DeletedBy, us.OwnedBy, us.RunAs}
t.SetUserRefs(uu)
}
}
func (t *base) Userstamps() *Userstamps {
return t.us
}
func (t *base) SetConfig(cfg *EnvoyConfig) {
t.cfg = cfg
}
func (t *base) Config() *EnvoyConfig {
return t.cfg
}
func (t *base) SetUserRefs(uu []*Userstamp) {
if t.urefs == nil {
t.urefs = make(RefSet, 0, 4)
}
for _, u := range uu {
if u == nil {
continue
}
if u.UserID > 0 {
t.urefs = append(t.urefs, t.AddRef(types.UserResourceType, strconv.FormatUint(u.UserID, 10)))
} else if u.Ref != "" {
t.urefs = append(t.urefs, t.AddRef(types.UserResourceType, u.Ref))
}
}
}
func (t *base) UserRefs() RefSet {
return t.urefs
}
func (t *base) Identifiers() Identifiers {
return t.ii
}
func (t *base) ResourceType() string {
return t.rt
}
func (t *base) Refs() RefSet {
return t.rr
}
func (t *base) Ref() *Ref {
return &Ref{ResourceType: t.rt, Identifiers: t.ii}
}
func (t *base) HasRefs() bool {
return t.rr == nil || len(t.rr) == 0
}
// MarkPlaceholder denotes that the given resource should be treated as a placeholder
//
// Placeholder resources should not be encoded but should only provide additional
// context to resources that depend on it
func (t *base) MarkPlaceholder() {
t.ph = true
}
// Placeholder resources should not be encoded but should only provide additional
// context to resources that depend on it
func (t *base) Placeholder() bool {
return t.ph
}
func IgnoreDepResolution(ref *Ref) bool {
return ref.ResourceType == composeTypes.ModuleFieldResourceType
}
func (t *base) ReID(ii Identifiers) {
t.SetIdentifier(ii)
}
func (t *base) ReRef(old RefSet, new RefSet) {
for i, o := range old {
t.ReplaceRef(o, new[i])
}
}