From 76d1318b836b7587e1866192033d0f4a50d4807e Mon Sep 17 00:00:00 2001 From: nicolst <35232838+nicolst@users.noreply.github.com> Date: Wed, 8 Jul 2026 13:52:22 +0200 Subject: [PATCH 1/9] workshop --- .../migrations/0013_team_features.sql | 8 + api/internal/graph/gengql/generated.go | 1131 ++++++++++++++++- api/internal/graph/schema/teams.graphqls | 60 + api/internal/graph/teams.resolvers.go | 46 + api/internal/team/model.go | 29 + api/internal/team/queries.go | 33 + api/internal/team/queries/team_feature.sql | 26 + api/internal/team/teamsql/models.go | 6 + api/internal/team/teamsql/querier.go | 3 + api/internal/team/teamsql/team_feature.sql.go | 83 ++ reconcilers/internal/cmd/reconciler/main.go | 3 + .../internal/reconcilers/dummy/reconciler.go | 56 + reconcilers/teams/a200-stoetteteam | 1 + reconcilers/teams/a300-gis-pii | 1 + reconcilers/teams/aordning-register | 1 + reconcilers/teams/arbmark-aku | 1 + reconcilers/teams/arbmark-register | 1 + reconcilers/teams/arbmark-skjema | 1 + reconcilers/teams/arbulykker | 1 + reconcilers/teams/areal | 1 + reconcilers/teams/arkitektur | 1 + reconcilers/teams/barnevern | 1 + reconcilers/teams/barneverng | 1 + reconcilers/teams/barneverni | 1 + reconcilers/teams/bef-analyse | 1 + reconcilers/teams/bef-bosted | 1 + reconcilers/teams/bef-husholdning | 1 + reconcilers/teams/bef-oppdrag | 1 + reconcilers/teams/bef-regional | 1 + reconcilers/teams/bef-statistikk | 1 + reconcilers/teams/bef-valg | 1 + reconcilers/teams/befstat | 1 + reconcilers/teams/betfor | 1 + reconcilers/teams/bilpark-nybil | 1 + reconcilers/teams/bki | 1 + reconcilers/teams/bof-stedfesting | 1 + reconcilers/teams/boforholdregister | 1 + reconcilers/teams/bpi | 1 + reconcilers/teams/brann-kostra | 1 + reconcilers/teams/bygg | 1 + reconcilers/teams/dapla-felles | 1 + reconcilers/teams/dapla-ffunk | 1 + reconcilers/teams/dapla-lab | 1 + reconcilers/teams/dapla-metadata | 1 + reconcilers/teams/dapla-onprem-vpn | 1 + reconcilers/teams/dapla-platform | 1 + reconcilers/teams/dapla-pseudo | 1 + reconcilers/teams/dapla-skyinfra | 1 + reconcilers/teams/dapla-stat | 1 + reconcilers/teams/datafangst-alf | 1 + reconcilers/teams/datafangst-altinn | 1 + reconcilers/teams/datafangst-blaise | 1 + reconcilers/teams/datafangst-innfin | 1 + reconcilers/teams/datafangst-kart | 1 + reconcilers/teams/datafangst-m2m | 1 + reconcilers/teams/datafangst-person | 1 + reconcilers/teams/datafangst-planle | 1 + reconcilers/teams/dftjen | 1 + reconcilers/teams/el-pris-volum | 1 + reconcilers/teams/energ-ind-korttid | 1 + reconcilers/teams/energi-ereb | 1 + reconcilers/teams/energi-fjernvarme | 1 + reconcilers/teams/energi-industri | 1 + reconcilers/teams/energi-petrole | 1 + reconcilers/teams/energi-rapp | 1 + reconcilers/teams/etlev | 1 + reconcilers/teams/famvern | 1 + reconcilers/teams/fastlegetj | 1 + reconcilers/teams/finmark | 1 + reconcilers/teams/finpop | 1 + reconcilers/teams/finregn | 1 + reconcilers/teams/folksim | 1 + reconcilers/teams/forbruk-isolert | 1 + reconcilers/teams/forbruk-stat | 1 + reconcilers/teams/forbruk-transak | 1 + reconcilers/teams/fordelingsregnska | 1 + reconcilers/teams/forsk-mismatch | 1 + reconcilers/teams/forsk-nhm | 1 + reconcilers/teams/forskteknar-forsk | 1 + reconcilers/teams/forskteknar-narin | 1 + reconcilers/teams/forskteknar-tek | 1 + reconcilers/teams/funkhem | 1 + reconcilers/teams/hack-fnrleting | 1 + reconcilers/teams/helseforhold | 1 + reconcilers/teams/helsetjko | 1 + reconcilers/teams/infoforvaltning | 1 + reconcilers/teams/inntekt-hushold | 1 + reconcilers/teams/itinfra-bakkesyst | 1 + reconcilers/teams/itinfra-ks | 1 + reconcilers/teams/keycloak | 1 + reconcilers/teams/kombolig-kostra | 1 + reconcilers/teams/kosthald | 1 + reconcilers/teams/kostra | 1 + reconcilers/teams/krim-og-rett | 1 + reconcilers/teams/kultur-biblmuseum | 1 + reconcilers/teams/kultur-kultmed | 1 + reconcilers/teams/kultur-trokirke | 1 + reconcilers/teams/kurs-fra-kilde | 1 + reconcilers/teams/laerermod | 1 + reconcilers/teams/lb-sky | 1 + reconcilers/teams/levekaar | 1 + reconcilers/teams/levekaar-arbeid | 1 + reconcilers/teams/levekaar-barn | 1 + reconcilers/teams/livskvalitet | 1 + reconcilers/teams/lotte | 1 + reconcilers/teams/makro-demec | 1 + reconcilers/teams/metode-naceomlegg | 1 + reconcilers/teams/metode-sesong | 1 + reconcilers/teams/microdata | 1 + reconcilers/teams/microdata-no | 1 + reconcilers/teams/mikrodata-oppdrag | 1 + reconcilers/teams/naturregnskap | 1 + reconcilers/teams/nr | 1 + reconcilers/teams/nr-likningsmodul | 1 + reconcilers/teams/nspek | 1 + reconcilers/teams/off-fin | 1 + reconcilers/teams/opera-forretning | 1 + reconcilers/teams/papis | 1 + reconcilers/teams/pasient | 1 + reconcilers/teams/play-chatbot | 1 + reconcilers/teams/play-datafangst | 1 + reconcilers/teams/play-dba | 1 + reconcilers/teams/play-enhjoern-a | 1 + reconcilers/teams/play-ffunk-edit-a | 1 + reconcilers/teams/play-ffunk-edit-b | 1 + reconcilers/teams/play-foeniks-a | 1 + reconcilers/teams/play-lab | 1 + reconcilers/teams/play-mabl-test | 1 + reconcilers/teams/play-obr | 1 + reconcilers/teams/play-obr-b | 1 + reconcilers/teams/play-skatt | 1 + reconcilers/teams/play-skyinfra-a | 1 + reconcilers/teams/pleie | 1 + reconcilers/teams/poc-composer | 1 + reconcilers/teams/pop-lb-eiendom | 1 + reconcilers/teams/pop-mat-gb | 1 + reconcilers/teams/primaer-j-reg | 1 + reconcilers/teams/primaer-j-skjema | 1 + reconcilers/teams/primaer-jakt | 1 + reconcilers/teams/prisstat | 1 + reconcilers/teams/proj-aiml-edit | 1 + reconcilers/teams/pseudo-comp-test | 1 + reconcilers/teams/reg-a-ordningen | 1 + reconcilers/teams/reg-bof | 1 + reconcilers/teams/reg-freg | 1 + reconcilers/teams/reg-matrikkel | 1 + reconcilers/teams/reiseliv-korttid | 1 + reconcilers/teams/royk | 1 + reconcilers/teams/sikkerhetssenter | 1 + reconcilers/teams/sirius-editering | 1 + reconcilers/teams/skatt-naering | 1 + reconcilers/teams/skatt-person | 1 + reconcilers/teams/sosial-kvp | 1 + reconcilers/teams/sosialhjelpk | 1 + reconcilers/teams/speshelse | 1 + reconcilers/teams/ssbno | 1 + reconcilers/teams/stat-skog | 1 + reconcilers/teams/statbank | 1 + reconcilers/teams/strukt-arbkost | 1 + reconcilers/teams/strukt-kraftnarin | 1 + reconcilers/teams/strukt-miljoe | 1 + reconcilers/teams/strukt-mva | 1 + reconcilers/teams/strukt-naering | 1 + reconcilers/teams/sup | 1 + reconcilers/teams/suv-altinn | 1 + reconcilers/teams/tannhelse | 1 + reconcilers/teams/tech-coach | 1 + reconcilers/teams/tidsbruk-survey | 1 + reconcilers/teams/tip-tutorials | 1 + reconcilers/teams/transport-baat | 1 + reconcilers/teams/transport-bil | 1 + reconcilers/teams/transport-fly | 1 + reconcilers/teams/transport-kollekt | 1 + reconcilers/teams/transport-kostind | 1 + reconcilers/teams/transport-kostra | 1 + reconcilers/teams/transport-lastbil | 1 + reconcilers/teams/trygd-person | 1 + reconcilers/teams/uh-tjenester | 1 + reconcilers/teams/uh-varer | 1 + reconcilers/teams/utd-bhgskole | 1 + reconcilers/teams/utd-inter | 1 + reconcilers/teams/utd-kompetanse | 1 + reconcilers/teams/utd-nudb | 1 + reconcilers/teams/utd-tverr | 1 + reconcilers/teams/utd-uhfagskole | 1 + reconcilers/teams/utd-vg | 1 + reconcilers/teams/utslipp-luft | 1 + reconcilers/teams/var-avfall | 1 + reconcilers/teams/var-avlop | 1 + reconcilers/teams/var-materialstrom | 1 + reconcilers/teams/var-vann-kostra | 1 + reconcilers/teams/vare-tjen-korttid | 1 + reconcilers/teams/verdsetting-bolig | 1 + reconcilers/teams/vof | 1 + 194 files changed, 1636 insertions(+), 30 deletions(-) create mode 100644 api/internal/database/migrations/0013_team_features.sql create mode 100644 api/internal/team/queries/team_feature.sql create mode 100644 api/internal/team/teamsql/team_feature.sql.go create mode 100644 reconcilers/internal/reconcilers/dummy/reconciler.go create mode 100644 reconcilers/teams/a200-stoetteteam create mode 100644 reconcilers/teams/a300-gis-pii create mode 100644 reconcilers/teams/aordning-register create mode 100644 reconcilers/teams/arbmark-aku create mode 100644 reconcilers/teams/arbmark-register create mode 100644 reconcilers/teams/arbmark-skjema create mode 100644 reconcilers/teams/arbulykker create mode 100644 reconcilers/teams/areal create mode 100644 reconcilers/teams/arkitektur create mode 100644 reconcilers/teams/barnevern create mode 100644 reconcilers/teams/barneverng create mode 100644 reconcilers/teams/barneverni create mode 100644 reconcilers/teams/bef-analyse create mode 100644 reconcilers/teams/bef-bosted create mode 100644 reconcilers/teams/bef-husholdning create mode 100644 reconcilers/teams/bef-oppdrag create mode 100644 reconcilers/teams/bef-regional create mode 100644 reconcilers/teams/bef-statistikk create mode 100644 reconcilers/teams/bef-valg create mode 100644 reconcilers/teams/befstat create mode 100644 reconcilers/teams/betfor create mode 100644 reconcilers/teams/bilpark-nybil create mode 100644 reconcilers/teams/bki create mode 100644 reconcilers/teams/bof-stedfesting create mode 100644 reconcilers/teams/boforholdregister create mode 100644 reconcilers/teams/bpi create mode 100644 reconcilers/teams/brann-kostra create mode 100644 reconcilers/teams/bygg create mode 100644 reconcilers/teams/dapla-felles create mode 100644 reconcilers/teams/dapla-ffunk create mode 100644 reconcilers/teams/dapla-lab create mode 100644 reconcilers/teams/dapla-metadata create mode 100644 reconcilers/teams/dapla-onprem-vpn create mode 100644 reconcilers/teams/dapla-platform create mode 100644 reconcilers/teams/dapla-pseudo create mode 100644 reconcilers/teams/dapla-skyinfra create mode 100644 reconcilers/teams/dapla-stat create mode 100644 reconcilers/teams/datafangst-alf create mode 100644 reconcilers/teams/datafangst-altinn create mode 100644 reconcilers/teams/datafangst-blaise create mode 100644 reconcilers/teams/datafangst-innfin create mode 100644 reconcilers/teams/datafangst-kart create mode 100644 reconcilers/teams/datafangst-m2m create mode 100644 reconcilers/teams/datafangst-person create mode 100644 reconcilers/teams/datafangst-planle create mode 100644 reconcilers/teams/dftjen create mode 100644 reconcilers/teams/el-pris-volum create mode 100644 reconcilers/teams/energ-ind-korttid create mode 100644 reconcilers/teams/energi-ereb create mode 100644 reconcilers/teams/energi-fjernvarme create mode 100644 reconcilers/teams/energi-industri create mode 100644 reconcilers/teams/energi-petrole create mode 100644 reconcilers/teams/energi-rapp create mode 100644 reconcilers/teams/etlev create mode 100644 reconcilers/teams/famvern create mode 100644 reconcilers/teams/fastlegetj create mode 100644 reconcilers/teams/finmark create mode 100644 reconcilers/teams/finpop create mode 100644 reconcilers/teams/finregn create mode 100644 reconcilers/teams/folksim create mode 100644 reconcilers/teams/forbruk-isolert create mode 100644 reconcilers/teams/forbruk-stat create mode 100644 reconcilers/teams/forbruk-transak create mode 100644 reconcilers/teams/fordelingsregnska create mode 100644 reconcilers/teams/forsk-mismatch create mode 100644 reconcilers/teams/forsk-nhm create mode 100644 reconcilers/teams/forskteknar-forsk create mode 100644 reconcilers/teams/forskteknar-narin create mode 100644 reconcilers/teams/forskteknar-tek create mode 100644 reconcilers/teams/funkhem create mode 100644 reconcilers/teams/hack-fnrleting create mode 100644 reconcilers/teams/helseforhold create mode 100644 reconcilers/teams/helsetjko create mode 100644 reconcilers/teams/infoforvaltning create mode 100644 reconcilers/teams/inntekt-hushold create mode 100644 reconcilers/teams/itinfra-bakkesyst create mode 100644 reconcilers/teams/itinfra-ks create mode 100644 reconcilers/teams/keycloak create mode 100644 reconcilers/teams/kombolig-kostra create mode 100644 reconcilers/teams/kosthald create mode 100644 reconcilers/teams/kostra create mode 100644 reconcilers/teams/krim-og-rett create mode 100644 reconcilers/teams/kultur-biblmuseum create mode 100644 reconcilers/teams/kultur-kultmed create mode 100644 reconcilers/teams/kultur-trokirke create mode 100644 reconcilers/teams/kurs-fra-kilde create mode 100644 reconcilers/teams/laerermod create mode 100644 reconcilers/teams/lb-sky create mode 100644 reconcilers/teams/levekaar create mode 100644 reconcilers/teams/levekaar-arbeid create mode 100644 reconcilers/teams/levekaar-barn create mode 100644 reconcilers/teams/livskvalitet create mode 100644 reconcilers/teams/lotte create mode 100644 reconcilers/teams/makro-demec create mode 100644 reconcilers/teams/metode-naceomlegg create mode 100644 reconcilers/teams/metode-sesong create mode 100644 reconcilers/teams/microdata create mode 100644 reconcilers/teams/microdata-no create mode 100644 reconcilers/teams/mikrodata-oppdrag create mode 100644 reconcilers/teams/naturregnskap create mode 100644 reconcilers/teams/nr create mode 100644 reconcilers/teams/nr-likningsmodul create mode 100644 reconcilers/teams/nspek create mode 100644 reconcilers/teams/off-fin create mode 100644 reconcilers/teams/opera-forretning create mode 100644 reconcilers/teams/papis create mode 100644 reconcilers/teams/pasient create mode 100644 reconcilers/teams/play-chatbot create mode 100644 reconcilers/teams/play-datafangst create mode 100644 reconcilers/teams/play-dba create mode 100644 reconcilers/teams/play-enhjoern-a create mode 100644 reconcilers/teams/play-ffunk-edit-a create mode 100644 reconcilers/teams/play-ffunk-edit-b create mode 100644 reconcilers/teams/play-foeniks-a create mode 100644 reconcilers/teams/play-lab create mode 100644 reconcilers/teams/play-mabl-test create mode 100644 reconcilers/teams/play-obr create mode 100644 reconcilers/teams/play-obr-b create mode 100644 reconcilers/teams/play-skatt create mode 100644 reconcilers/teams/play-skyinfra-a create mode 100644 reconcilers/teams/pleie create mode 100644 reconcilers/teams/poc-composer create mode 100644 reconcilers/teams/pop-lb-eiendom create mode 100644 reconcilers/teams/pop-mat-gb create mode 100644 reconcilers/teams/primaer-j-reg create mode 100644 reconcilers/teams/primaer-j-skjema create mode 100644 reconcilers/teams/primaer-jakt create mode 100644 reconcilers/teams/prisstat create mode 100644 reconcilers/teams/proj-aiml-edit create mode 100644 reconcilers/teams/pseudo-comp-test create mode 100644 reconcilers/teams/reg-a-ordningen create mode 100644 reconcilers/teams/reg-bof create mode 100644 reconcilers/teams/reg-freg create mode 100644 reconcilers/teams/reg-matrikkel create mode 100644 reconcilers/teams/reiseliv-korttid create mode 100644 reconcilers/teams/royk create mode 100644 reconcilers/teams/sikkerhetssenter create mode 100644 reconcilers/teams/sirius-editering create mode 100644 reconcilers/teams/skatt-naering create mode 100644 reconcilers/teams/skatt-person create mode 100644 reconcilers/teams/sosial-kvp create mode 100644 reconcilers/teams/sosialhjelpk create mode 100644 reconcilers/teams/speshelse create mode 100644 reconcilers/teams/ssbno create mode 100644 reconcilers/teams/stat-skog create mode 100644 reconcilers/teams/statbank create mode 100644 reconcilers/teams/strukt-arbkost create mode 100644 reconcilers/teams/strukt-kraftnarin create mode 100644 reconcilers/teams/strukt-miljoe create mode 100644 reconcilers/teams/strukt-mva create mode 100644 reconcilers/teams/strukt-naering create mode 100644 reconcilers/teams/sup create mode 100644 reconcilers/teams/suv-altinn create mode 100644 reconcilers/teams/tannhelse create mode 100644 reconcilers/teams/tech-coach create mode 100644 reconcilers/teams/tidsbruk-survey create mode 100644 reconcilers/teams/tip-tutorials create mode 100644 reconcilers/teams/transport-baat create mode 100644 reconcilers/teams/transport-bil create mode 100644 reconcilers/teams/transport-fly create mode 100644 reconcilers/teams/transport-kollekt create mode 100644 reconcilers/teams/transport-kostind create mode 100644 reconcilers/teams/transport-kostra create mode 100644 reconcilers/teams/transport-lastbil create mode 100644 reconcilers/teams/trygd-person create mode 100644 reconcilers/teams/uh-tjenester create mode 100644 reconcilers/teams/uh-varer create mode 100644 reconcilers/teams/utd-bhgskole create mode 100644 reconcilers/teams/utd-inter create mode 100644 reconcilers/teams/utd-kompetanse create mode 100644 reconcilers/teams/utd-nudb create mode 100644 reconcilers/teams/utd-tverr create mode 100644 reconcilers/teams/utd-uhfagskole create mode 100644 reconcilers/teams/utd-vg create mode 100644 reconcilers/teams/utslipp-luft create mode 100644 reconcilers/teams/var-avfall create mode 100644 reconcilers/teams/var-avlop create mode 100644 reconcilers/teams/var-materialstrom create mode 100644 reconcilers/teams/var-vann-kostra create mode 100644 reconcilers/teams/vare-tjen-korttid create mode 100644 reconcilers/teams/verdsetting-bolig create mode 100644 reconcilers/teams/vof diff --git a/api/internal/database/migrations/0013_team_features.sql b/api/internal/database/migrations/0013_team_features.sql new file mode 100644 index 0000000..8c9bfa7 --- /dev/null +++ b/api/internal/database/migrations/0013_team_features.sql @@ -0,0 +1,8 @@ +-- +goose Up +CREATE TABLE team_features ( + team_slug slug NOT NULL references teams (slug) ON DELETE CASCADE, + name TEXT NOT NULL, + env TEXT NOT NULL, + UNIQUE (team_slug, name, env) +) +; diff --git a/api/internal/graph/gengql/generated.go b/api/internal/graph/gengql/generated.go index e0c84c3..5da5f19 100644 --- a/api/internal/graph/gengql/generated.go +++ b/api/internal/graph/gengql/generated.go @@ -47,6 +47,8 @@ type Config = graphql.Config[ResolverRoot, DirectiveRoot, ComplexityRoot] type ResolverRoot interface { AddTeamAccessManagerPayload() AddTeamAccessManagerPayloadResolver + DisableTeamFeaturePayload() DisableTeamFeaturePayloadResolver + EnableTeamFeaturePayload() EnableTeamFeaturePayloadResolver Group() GroupResolver GroupMember() GroupMemberResolver Message() MessageResolver @@ -123,6 +125,18 @@ type ComplexityRoot struct { ServiceAccountTokenDeleted func(childComplexity int) int } + DisableTeamFeaturePayload struct { + Env func(childComplexity int) int + Feature func(childComplexity int) int + Team func(childComplexity int) int + } + + EnableTeamFeaturePayload struct { + Env func(childComplexity int) int + Feature func(childComplexity int) int + Team func(childComplexity int) int + } + Features struct { ID func(childComplexity int) int } @@ -238,7 +252,9 @@ type ComplexityRoot struct { DeleteServiceAccount func(childComplexity int, input serviceaccount.DeleteServiceAccountInput) int DeleteServiceAccountToken func(childComplexity int, input serviceaccount.DeleteServiceAccountTokenInput) int DisableReconciler func(childComplexity int, input reconciler.DisableReconcilerInput) int + DisableTeamFeature func(childComplexity int, input team.DisableTeamFeatureInput) int EnableReconciler func(childComplexity int, input reconciler.EnableReconcilerInput) int + EnableTeamFeature func(childComplexity int, input team.EnableTeamFeatureInput) int RemoveGroupMember func(childComplexity int, input group.RemoveGroupMemberInput) int RemoveTeamAccessManager func(childComplexity int, input team.RemoveTeamAccessManagerInput) int RevokeRoleFromServiceAccount func(childComplexity int, input serviceaccount.RevokeRoleFromServiceAccountInput) int @@ -666,6 +682,7 @@ type ComplexityRoot struct { ActivityLog func(childComplexity int, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, filter *activitylog.ActivityLogFilter) int DeletionInProgress func(childComplexity int) int DisplayName func(childComplexity int) int + Features func(childComplexity int) int Groups func(childComplexity int, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, orderBy *group.GroupOrder, filter *group.GroupFilter) int HasManualEditing func(childComplexity int) int ID func(childComplexity int) int @@ -708,6 +725,11 @@ type ComplexityRoot struct { Node func(childComplexity int) int } + TeamFeature struct { + Env func(childComplexity int) int + Name func(childComplexity int) int + } + TeamMember struct { Groups func(childComplexity int) int Team func(childComplexity int) int @@ -877,6 +899,12 @@ type AddTeamAccessManagerPayloadResolver interface { Team(ctx context.Context, obj *team.AddTeamAccessManagerPayload) (*team.Team, error) User(ctx context.Context, obj *team.AddTeamAccessManagerPayload) (*user.User, error) } +type DisableTeamFeaturePayloadResolver interface { + Team(ctx context.Context, obj *team.DisableTeamFeaturePayload) (*team.Team, error) +} +type EnableTeamFeaturePayloadResolver interface { + Team(ctx context.Context, obj *team.EnableTeamFeaturePayload) (*team.Team, error) +} type GroupResolver interface { Members(ctx context.Context, obj *group.Group, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, orderBy *user.UserOrder) (*pagination.Connection[*group.GroupMember], error) SharedBucketsAccess(ctx context.Context, obj *group.Group, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, orderBy *sharedbucketsstopgap.SharedBucketOrder) (*pagination.Connection[*sharedbucketsstopgap.SharedBucket], error) @@ -911,6 +939,8 @@ type MutationResolver interface { UpdateTeam(ctx context.Context, input team.UpdateTeamInput) (*team.UpdateTeamPayload, error) AddTeamAccessManager(ctx context.Context, input team.AddTeamAccessManagerInput) (*team.AddTeamAccessManagerPayload, error) RemoveTeamAccessManager(ctx context.Context, input team.RemoveTeamAccessManagerInput) (*team.RemoveTeamAccessManagerPayload, error) + EnableTeamFeature(ctx context.Context, input team.EnableTeamFeatureInput) (*team.EnableTeamFeaturePayload, error) + DisableTeamFeature(ctx context.Context, input team.DisableTeamFeatureInput) (*team.DisableTeamFeaturePayload, error) } type QueryResolver interface { Node(ctx context.Context, id ident.Ident) (model.Node, error) @@ -988,6 +1018,7 @@ type TeamResolver interface { ViewerCanManageMembers(ctx context.Context, obj *team.Team) (bool, error) ViewerTeamMember(ctx context.Context, obj *team.Team) (*team.TeamMember, error) AccessManagers(ctx context.Context, obj *team.Team) ([]*team.TeamAccessManager, error) + Features(ctx context.Context, obj *team.Team) ([]*team.TeamFeature, error) ActivityLog(ctx context.Context, obj *team.Team, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, filter *activitylog.ActivityLogFilter) (*pagination.Connection[activitylog.ActivityLogEntry], error) } type TeamAccessManagerResolver interface { @@ -1151,6 +1182,44 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.ComplexityRoot.DeleteServiceAccountTokenPayload.ServiceAccountTokenDeleted(childComplexity), true + case "DisableTeamFeaturePayload.env": + if e.ComplexityRoot.DisableTeamFeaturePayload.Env == nil { + break + } + + return e.ComplexityRoot.DisableTeamFeaturePayload.Env(childComplexity), true + case "DisableTeamFeaturePayload.feature": + if e.ComplexityRoot.DisableTeamFeaturePayload.Feature == nil { + break + } + + return e.ComplexityRoot.DisableTeamFeaturePayload.Feature(childComplexity), true + case "DisableTeamFeaturePayload.team": + if e.ComplexityRoot.DisableTeamFeaturePayload.Team == nil { + break + } + + return e.ComplexityRoot.DisableTeamFeaturePayload.Team(childComplexity), true + + case "EnableTeamFeaturePayload.env": + if e.ComplexityRoot.EnableTeamFeaturePayload.Env == nil { + break + } + + return e.ComplexityRoot.EnableTeamFeaturePayload.Env(childComplexity), true + case "EnableTeamFeaturePayload.feature": + if e.ComplexityRoot.EnableTeamFeaturePayload.Feature == nil { + break + } + + return e.ComplexityRoot.EnableTeamFeaturePayload.Feature(childComplexity), true + case "EnableTeamFeaturePayload.team": + if e.ComplexityRoot.EnableTeamFeaturePayload.Team == nil { + break + } + + return e.ComplexityRoot.EnableTeamFeaturePayload.Team(childComplexity), true + case "Features.id": if e.ComplexityRoot.Features.ID == nil { break @@ -1650,6 +1719,17 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin } return e.ComplexityRoot.Mutation.DisableReconciler(childComplexity, args["input"].(reconciler.DisableReconcilerInput)), true + case "Mutation.disableTeamFeature": + if e.ComplexityRoot.Mutation.DisableTeamFeature == nil { + break + } + + args, err := ec.field_Mutation_disableTeamFeature_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.ComplexityRoot.Mutation.DisableTeamFeature(childComplexity, args["input"].(team.DisableTeamFeatureInput)), true case "Mutation.enableReconciler": if e.ComplexityRoot.Mutation.EnableReconciler == nil { break @@ -1661,6 +1741,17 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin } return e.ComplexityRoot.Mutation.EnableReconciler(childComplexity, args["input"].(reconciler.EnableReconcilerInput)), true + case "Mutation.enableTeamFeature": + if e.ComplexityRoot.Mutation.EnableTeamFeature == nil { + break + } + + args, err := ec.field_Mutation_enableTeamFeature_args(ctx, rawArgs) + if err != nil { + return 0, false + } + + return e.ComplexityRoot.Mutation.EnableTeamFeature(childComplexity, args["input"].(team.EnableTeamFeatureInput)), true case "Mutation.removeGroupMember": if e.ComplexityRoot.Mutation.RemoveGroupMember == nil { break @@ -3457,6 +3548,12 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin } return e.ComplexityRoot.Team.DisplayName(childComplexity), true + case "Team.features": + if e.ComplexityRoot.Team.Features == nil { + break + } + + return e.ComplexityRoot.Team.Features(childComplexity), true case "Team.groups": if e.ComplexityRoot.Team.Groups == nil { break @@ -3650,6 +3747,19 @@ func (e *executableSchema) Complexity(ctx context.Context, typeName, field strin return e.ComplexityRoot.TeamEdge.Node(childComplexity), true + case "TeamFeature.env": + if e.ComplexityRoot.TeamFeature.Env == nil { + break + } + + return e.ComplexityRoot.TeamFeature.Env(childComplexity), true + case "TeamFeature.name": + if e.ComplexityRoot.TeamFeature.Name == nil { + break + } + + return e.ComplexityRoot.TeamFeature.Name(childComplexity), true + case "TeamMember.groups": if e.ComplexityRoot.TeamMember.Groups == nil { break @@ -4284,7 +4394,9 @@ func (e *executableSchema) Exec(ctx context.Context) graphql.ResponseHandler { ec.unmarshalInputDeleteServiceAccountInput, ec.unmarshalInputDeleteServiceAccountTokenInput, ec.unmarshalInputDisableReconcilerInput, + ec.unmarshalInputDisableTeamFeatureInput, ec.unmarshalInputEnableReconcilerInput, + ec.unmarshalInputEnableTeamFeatureInput, ec.unmarshalInputGroupFilter, ec.unmarshalInputGroupOrder, ec.unmarshalInputMessageFilter, @@ -7376,6 +7488,10 @@ extend type Mutation { This lets section managers delegate access management to up to two other people. """ removeTeamAccessManager(input: RemoveTeamAccessManagerInput!): RemoveTeamAccessManagerPayload! + + enableTeamFeature(input: EnableTeamFeatureInput!): EnableTeamFeaturePayload! + + disableTeamFeature(input: DisableTeamFeatureInput!): DisableTeamFeaturePayload! } """ @@ -7512,6 +7628,14 @@ type Team implements Node { "The access managers for the team." accessManagers: [TeamAccessManager!]! + + features: [TeamFeature!]! +} + +type TeamFeature { + name: String! + + env: String! } type TeamMember { @@ -7559,6 +7683,24 @@ type RemoveTeamAccessManagerPayload { user: User! } +type EnableTeamFeaturePayload { + team: Team! + + "" + feature: String! + + env: String! +} + +type DisableTeamFeaturePayload { + team: Team! + + "" + feature: String! + + env: String! +} + type TeamConnection { "Pagination information." pageInfo: PageInfo! @@ -7674,6 +7816,36 @@ input RemoveTeamAccessManagerInput { userEmail: String! } +input EnableTeamFeatureInput { + "Slug of the team to set access managers for." + teamSlug: Slug! + + """ + Feature name + """ + feature: String! + + """ + Environment + """ + env: String! +} + +input DisableTeamFeatureInput { + "Slug of the team to set access managers for." + teamSlug: Slug! + + """ + Feature name + """ + feature: String! + + """ + Environment + """ + env: String! +} + "Ordering options when fetching teams." input TeamOrder { "The field to order items by." @@ -8745,6 +8917,17 @@ func (ec *executionContext) field_Mutation_disableReconciler_args(ctx context.Co return args, nil } +func (ec *executionContext) field_Mutation_disableTeamFeature_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNDisableTeamFeatureInput2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐDisableTeamFeatureInput) + if err != nil { + return nil, err + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_enableReconciler_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -8756,6 +8939,17 @@ func (ec *executionContext) field_Mutation_enableReconciler_args(ctx context.Con return args, nil } +func (ec *executionContext) field_Mutation_enableTeamFeature_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { + var err error + args := map[string]any{} + arg0, err := graphql.ProcessArgField(ctx, rawArgs, "input", ec.unmarshalNEnableTeamFeatureInput2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐEnableTeamFeatureInput) + if err != nil { + return nil, err + } + args["input"] = arg0 + return args, nil +} + func (ec *executionContext) field_Mutation_removeGroupMember_args(ctx context.Context, rawArgs map[string]any) (map[string]any, error) { var err error args := map[string]any{} @@ -10169,6 +10363,8 @@ func (ec *executionContext) fieldContext_AddTeamAccessManagerPayload_team(_ cont return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -10563,6 +10759,8 @@ func (ec *executionContext) fieldContext_CreateTeamPayload_team(_ context.Contex return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -10679,6 +10877,260 @@ func (ec *executionContext) fieldContext_DeleteServiceAccountTokenPayload_servic return fc, nil } +func (ec *executionContext) _DisableTeamFeaturePayload_team(ctx context.Context, field graphql.CollectedField, obj *team.DisableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_DisableTeamFeaturePayload_team, + func(ctx context.Context) (any, error) { + return ec.Resolvers.DisableTeamFeaturePayload().Team(ctx, obj) + }, + nil, + ec.marshalNTeam2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeam, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_DisableTeamFeaturePayload_team(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "DisableTeamFeaturePayload", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Team_id(ctx, field) + case "slug": + return ec.fieldContext_Team_slug(ctx, field) + case "displayName": + return ec.fieldContext_Team_displayName(ctx, field) + case "section": + return ec.fieldContext_Team_section(ctx, field) + case "isManaged": + return ec.fieldContext_Team_isManaged(ctx, field) + case "hasManualEditing": + return ec.fieldContext_Team_hasManualEditing(ctx, field) + case "members": + return ec.fieldContext_Team_members(ctx, field) + case "groups": + return ec.fieldContext_Team_groups(ctx, field) + case "sharedBuckets": + return ec.fieldContext_Team_sharedBuckets(ctx, field) + case "sharedBucketsAccess": + return ec.fieldContext_Team_sharedBucketsAccess(ctx, field) + case "lastSuccessfulSync": + return ec.fieldContext_Team_lastSuccessfulSync(ctx, field) + case "deletionInProgress": + return ec.fieldContext_Team_deletionInProgress(ctx, field) + case "viewerIsOwner": + return ec.fieldContext_Team_viewerIsOwner(ctx, field) + case "viewerIsMember": + return ec.fieldContext_Team_viewerIsMember(ctx, field) + case "viewerCanManageMembers": + return ec.fieldContext_Team_viewerCanManageMembers(ctx, field) + case "viewerTeamMember": + return ec.fieldContext_Team_viewerTeamMember(ctx, field) + case "accessManagers": + return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) + case "activityLog": + return ec.fieldContext_Team_activityLog(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Team", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _DisableTeamFeaturePayload_feature(ctx context.Context, field graphql.CollectedField, obj *team.DisableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_DisableTeamFeaturePayload_feature, + func(ctx context.Context) (any, error) { + return obj.Feature, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_DisableTeamFeaturePayload_feature(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "DisableTeamFeaturePayload", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _DisableTeamFeaturePayload_env(ctx context.Context, field graphql.CollectedField, obj *team.DisableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_DisableTeamFeaturePayload_env, + func(ctx context.Context) (any, error) { + return obj.Env, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_DisableTeamFeaturePayload_env(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "DisableTeamFeaturePayload", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _EnableTeamFeaturePayload_team(ctx context.Context, field graphql.CollectedField, obj *team.EnableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_EnableTeamFeaturePayload_team, + func(ctx context.Context) (any, error) { + return ec.Resolvers.EnableTeamFeaturePayload().Team(ctx, obj) + }, + nil, + ec.marshalNTeam2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeam, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_EnableTeamFeaturePayload_team(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EnableTeamFeaturePayload", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "id": + return ec.fieldContext_Team_id(ctx, field) + case "slug": + return ec.fieldContext_Team_slug(ctx, field) + case "displayName": + return ec.fieldContext_Team_displayName(ctx, field) + case "section": + return ec.fieldContext_Team_section(ctx, field) + case "isManaged": + return ec.fieldContext_Team_isManaged(ctx, field) + case "hasManualEditing": + return ec.fieldContext_Team_hasManualEditing(ctx, field) + case "members": + return ec.fieldContext_Team_members(ctx, field) + case "groups": + return ec.fieldContext_Team_groups(ctx, field) + case "sharedBuckets": + return ec.fieldContext_Team_sharedBuckets(ctx, field) + case "sharedBucketsAccess": + return ec.fieldContext_Team_sharedBucketsAccess(ctx, field) + case "lastSuccessfulSync": + return ec.fieldContext_Team_lastSuccessfulSync(ctx, field) + case "deletionInProgress": + return ec.fieldContext_Team_deletionInProgress(ctx, field) + case "viewerIsOwner": + return ec.fieldContext_Team_viewerIsOwner(ctx, field) + case "viewerIsMember": + return ec.fieldContext_Team_viewerIsMember(ctx, field) + case "viewerCanManageMembers": + return ec.fieldContext_Team_viewerCanManageMembers(ctx, field) + case "viewerTeamMember": + return ec.fieldContext_Team_viewerTeamMember(ctx, field) + case "accessManagers": + return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) + case "activityLog": + return ec.fieldContext_Team_activityLog(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type Team", field.Name) + }, + } + return fc, nil +} + +func (ec *executionContext) _EnableTeamFeaturePayload_feature(ctx context.Context, field graphql.CollectedField, obj *team.EnableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_EnableTeamFeaturePayload_feature, + func(ctx context.Context) (any, error) { + return obj.Feature, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_EnableTeamFeaturePayload_feature(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EnableTeamFeaturePayload", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _EnableTeamFeaturePayload_env(ctx context.Context, field graphql.CollectedField, obj *team.EnableTeamFeaturePayload) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_EnableTeamFeaturePayload_env, + func(ctx context.Context) (any, error) { + return obj.Env, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_EnableTeamFeaturePayload_env(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "EnableTeamFeaturePayload", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _Features_id(ctx context.Context, field graphql.CollectedField, obj *feature.Features) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -13566,6 +14018,104 @@ func (ec *executionContext) fieldContext_Mutation_removeTeamAccessManager(ctx co return fc, nil } +func (ec *executionContext) _Mutation_enableTeamFeature(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_enableTeamFeature, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().EnableTeamFeature(ctx, fc.Args["input"].(team.EnableTeamFeatureInput)) + }, + nil, + ec.marshalNEnableTeamFeaturePayload2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐEnableTeamFeaturePayload, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_enableTeamFeature(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "team": + return ec.fieldContext_EnableTeamFeaturePayload_team(ctx, field) + case "feature": + return ec.fieldContext_EnableTeamFeaturePayload_feature(ctx, field) + case "env": + return ec.fieldContext_EnableTeamFeaturePayload_env(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type EnableTeamFeaturePayload", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_enableTeamFeature_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + +func (ec *executionContext) _Mutation_disableTeamFeature(ctx context.Context, field graphql.CollectedField) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Mutation_disableTeamFeature, + func(ctx context.Context) (any, error) { + fc := graphql.GetFieldContext(ctx) + return ec.Resolvers.Mutation().DisableTeamFeature(ctx, fc.Args["input"].(team.DisableTeamFeatureInput)) + }, + nil, + ec.marshalNDisableTeamFeaturePayload2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐDisableTeamFeaturePayload, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Mutation_disableTeamFeature(ctx context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Mutation", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "team": + return ec.fieldContext_DisableTeamFeaturePayload_team(ctx, field) + case "feature": + return ec.fieldContext_DisableTeamFeaturePayload_feature(ctx, field) + case "env": + return ec.fieldContext_DisableTeamFeaturePayload_env(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type DisableTeamFeaturePayload", field.Name) + }, + } + defer func() { + if r := recover(); r != nil { + err = ec.Recover(ctx, r) + ec.Error(ctx, err) + } + }() + ctx = graphql.WithFieldContext(ctx, fc) + if fc.Args, err = ec.field_Mutation_disableTeamFeature_args(ctx, field.ArgumentMap(ec.Variables)); err != nil { + ec.Error(ctx, err) + return fc, err + } + return fc, nil +} + func (ec *executionContext) _PageInfo_hasNextPage(ctx context.Context, field graphql.CollectedField, obj *pagination.PageInfo) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -14679,6 +15229,8 @@ func (ec *executionContext) fieldContext_Query_team(ctx context.Context, field g return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -16595,6 +17147,8 @@ func (ec *executionContext) fieldContext_ReconcilerError_team(_ context.Context, return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -16959,6 +17513,8 @@ func (ec *executionContext) fieldContext_RemoveTeamAccessManagerPayload_team(_ c return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -19043,6 +19599,8 @@ func (ec *executionContext) fieldContext_ServiceAccount_team(_ context.Context, return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -21618,6 +22176,8 @@ func (ec *executionContext) fieldContext_SharedBucket_team(_ context.Context, fi return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -21932,6 +22492,8 @@ func (ec *executionContext) fieldContext_SharedBucketAccess_team(_ context.Conte return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -22979,6 +23541,41 @@ func (ec *executionContext) fieldContext_Team_accessManagers(_ context.Context, return fc, nil } +func (ec *executionContext) _Team_features(ctx context.Context, field graphql.CollectedField, obj *team.Team) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_Team_features, + func(ctx context.Context) (any, error) { + return ec.Resolvers.Team().Features(ctx, obj) + }, + nil, + ec.marshalNTeamFeature2ᚕᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeamFeatureᚄ, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_Team_features(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "Team", + Field: field, + IsMethod: true, + IsResolver: true, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + switch field.Name { + case "name": + return ec.fieldContext_TeamFeature_name(ctx, field) + case "env": + return ec.fieldContext_TeamFeature_env(ctx, field) + } + return nil, fmt.Errorf("no field named %q was found under type TeamFeature", field.Name) + }, + } + return fc, nil +} + func (ec *executionContext) _Team_activityLog(ctx context.Context, field graphql.CollectedField, obj *team.Team) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -23086,6 +23683,8 @@ func (ec *executionContext) fieldContext_TeamAccessManager_team(_ context.Contex return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -23257,6 +23856,8 @@ func (ec *executionContext) fieldContext_TeamConnection_nodes(_ context.Context, return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -23591,6 +24192,8 @@ func (ec *executionContext) fieldContext_TeamEdge_node(_ context.Context, field return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -23600,6 +24203,64 @@ func (ec *executionContext) fieldContext_TeamEdge_node(_ context.Context, field return fc, nil } +func (ec *executionContext) _TeamFeature_name(ctx context.Context, field graphql.CollectedField, obj *team.TeamFeature) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_TeamFeature_name, + func(ctx context.Context) (any, error) { + return obj.Name, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_TeamFeature_name(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamFeature", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + +func (ec *executionContext) _TeamFeature_env(ctx context.Context, field graphql.CollectedField, obj *team.TeamFeature) (ret graphql.Marshaler) { + return graphql.ResolveField( + ctx, + ec.OperationContext, + field, + ec.fieldContext_TeamFeature_env, + func(ctx context.Context) (any, error) { + return obj.Env, nil + }, + nil, + ec.marshalNString2string, + true, + true, + ) +} + +func (ec *executionContext) fieldContext_TeamFeature_env(_ context.Context, field graphql.CollectedField) (fc *graphql.FieldContext, err error) { + fc = &graphql.FieldContext{ + Object: "TeamFeature", + Field: field, + IsMethod: false, + IsResolver: false, + Child: func(ctx context.Context, field graphql.CollectedField) (*graphql.FieldContext, error) { + return nil, errors.New("field of type String does not have child fields") + }, + } + return fc, nil +} + func (ec *executionContext) _TeamMember_team(ctx context.Context, field graphql.CollectedField, obj *team.TeamMember) (ret graphql.Marshaler) { return graphql.ResolveField( ctx, @@ -23658,6 +24319,8 @@ func (ec *executionContext) fieldContext_TeamMember_team(_ context.Context, fiel return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -25169,6 +25832,8 @@ func (ec *executionContext) fieldContext_UpdateTeamPayload_team(_ context.Contex return ec.fieldContext_Team_viewerTeamMember(ctx, field) case "accessManagers": return ec.fieldContext_Team_accessManagers(ctx, field) + case "features": + return ec.fieldContext_Team_features(ctx, field) case "activityLog": return ec.fieldContext_Team_activityLog(ctx, field) } @@ -28826,6 +29491,50 @@ func (ec *executionContext) unmarshalInputDisableReconcilerInput(ctx context.Con return it, nil } +func (ec *executionContext) unmarshalInputDisableTeamFeatureInput(ctx context.Context, obj any) (team.DisableTeamFeatureInput, error) { + var it team.DisableTeamFeatureInput + if obj == nil { + return it, nil + } + + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"teamSlug", "feature", "env"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "teamSlug": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("teamSlug")) + data, err := ec.unmarshalNSlug2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋslugᚐSlug(ctx, v) + if err != nil { + return it, err + } + it.TeamSlug = data + case "feature": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("feature")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Feature = data + case "env": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("env")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Env = data + } + } + return it, nil +} + func (ec *executionContext) unmarshalInputEnableReconcilerInput(ctx context.Context, obj any) (reconciler.EnableReconcilerInput, error) { var it reconciler.EnableReconcilerInput if obj == nil { @@ -28856,6 +29565,50 @@ func (ec *executionContext) unmarshalInputEnableReconcilerInput(ctx context.Cont return it, nil } +func (ec *executionContext) unmarshalInputEnableTeamFeatureInput(ctx context.Context, obj any) (team.EnableTeamFeatureInput, error) { + var it team.EnableTeamFeatureInput + if obj == nil { + return it, nil + } + + asMap := map[string]any{} + for k, v := range obj.(map[string]any) { + asMap[k] = v + } + + fieldsInOrder := [...]string{"teamSlug", "feature", "env"} + for _, k := range fieldsInOrder { + v, ok := asMap[k] + if !ok { + continue + } + switch k { + case "teamSlug": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("teamSlug")) + data, err := ec.unmarshalNSlug2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋslugᚐSlug(ctx, v) + if err != nil { + return it, err + } + it.TeamSlug = data + case "feature": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("feature")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Feature = data + case "env": + ctx := graphql.WithPathContext(ctx, graphql.NewPathWithField("env")) + data, err := ec.unmarshalNString2string(ctx, v) + if err != nil { + return it, err + } + it.Env = data + } + } + return it, nil +} + func (ec *executionContext) unmarshalInputGroupFilter(ctx context.Context, obj any) (group.GroupFilter, error) { var it group.GroupFilter if obj == nil { @@ -30433,23 +31186,95 @@ func (ec *executionContext) _CreateServiceAccountPayload(ctx context.Context, se return out } -var createServiceAccountTokenPayloadImplementors = []string{"CreateServiceAccountTokenPayload"} +var createServiceAccountTokenPayloadImplementors = []string{"CreateServiceAccountTokenPayload"} + +func (ec *executionContext) _CreateServiceAccountTokenPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.CreateServiceAccountTokenPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, createServiceAccountTokenPayloadImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("CreateServiceAccountTokenPayload") + case "serviceAccount": + out.Values[i] = ec._CreateServiceAccountTokenPayload_serviceAccount(ctx, field, obj) + case "serviceAccountToken": + out.Values[i] = ec._CreateServiceAccountTokenPayload_serviceAccountToken(ctx, field, obj) + case "secret": + out.Values[i] = ec._CreateServiceAccountTokenPayload_secret(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var createTeamPayloadImplementors = []string{"CreateTeamPayload"} + +func (ec *executionContext) _CreateTeamPayload(ctx context.Context, sel ast.SelectionSet, obj *team.CreateTeamPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, createTeamPayloadImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("CreateTeamPayload") + case "team": + out.Values[i] = ec._CreateTeamPayload_team(ctx, field, obj) + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + +var deleteServiceAccountPayloadImplementors = []string{"DeleteServiceAccountPayload"} -func (ec *executionContext) _CreateServiceAccountTokenPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.CreateServiceAccountTokenPayload) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, createServiceAccountTokenPayloadImplementors) +func (ec *executionContext) _DeleteServiceAccountPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.DeleteServiceAccountPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, deleteServiceAccountPayloadImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("CreateServiceAccountTokenPayload") - case "serviceAccount": - out.Values[i] = ec._CreateServiceAccountTokenPayload_serviceAccount(ctx, field, obj) - case "serviceAccountToken": - out.Values[i] = ec._CreateServiceAccountTokenPayload_serviceAccountToken(ctx, field, obj) - case "secret": - out.Values[i] = ec._CreateServiceAccountTokenPayload_secret(ctx, field, obj) + out.Values[i] = graphql.MarshalString("DeleteServiceAccountPayload") + case "serviceAccountDeleted": + out.Values[i] = ec._DeleteServiceAccountPayload_serviceAccountDeleted(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -30473,19 +31298,21 @@ func (ec *executionContext) _CreateServiceAccountTokenPayload(ctx context.Contex return out } -var createTeamPayloadImplementors = []string{"CreateTeamPayload"} +var deleteServiceAccountTokenPayloadImplementors = []string{"DeleteServiceAccountTokenPayload"} -func (ec *executionContext) _CreateTeamPayload(ctx context.Context, sel ast.SelectionSet, obj *team.CreateTeamPayload) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, createTeamPayloadImplementors) +func (ec *executionContext) _DeleteServiceAccountTokenPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.DeleteServiceAccountTokenPayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, deleteServiceAccountTokenPayloadImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("CreateTeamPayload") - case "team": - out.Values[i] = ec._CreateTeamPayload_team(ctx, field, obj) + out.Values[i] = graphql.MarshalString("DeleteServiceAccountTokenPayload") + case "serviceAccount": + out.Values[i] = ec._DeleteServiceAccountTokenPayload_serviceAccount(ctx, field, obj) + case "serviceAccountTokenDeleted": + out.Values[i] = ec._DeleteServiceAccountTokenPayload_serviceAccountTokenDeleted(ctx, field, obj) default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -30509,19 +31336,63 @@ func (ec *executionContext) _CreateTeamPayload(ctx context.Context, sel ast.Sele return out } -var deleteServiceAccountPayloadImplementors = []string{"DeleteServiceAccountPayload"} +var disableTeamFeaturePayloadImplementors = []string{"DisableTeamFeaturePayload"} -func (ec *executionContext) _DeleteServiceAccountPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.DeleteServiceAccountPayload) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, deleteServiceAccountPayloadImplementors) +func (ec *executionContext) _DisableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, obj *team.DisableTeamFeaturePayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, disableTeamFeaturePayloadImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("DeleteServiceAccountPayload") - case "serviceAccountDeleted": - out.Values[i] = ec._DeleteServiceAccountPayload_serviceAccountDeleted(ctx, field, obj) + out.Values[i] = graphql.MarshalString("DisableTeamFeaturePayload") + case "team": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._DisableTeamFeaturePayload_team(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "feature": + out.Values[i] = ec._DisableTeamFeaturePayload_feature(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "env": + out.Values[i] = ec._DisableTeamFeaturePayload_env(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -30545,21 +31416,63 @@ func (ec *executionContext) _DeleteServiceAccountPayload(ctx context.Context, se return out } -var deleteServiceAccountTokenPayloadImplementors = []string{"DeleteServiceAccountTokenPayload"} +var enableTeamFeaturePayloadImplementors = []string{"EnableTeamFeaturePayload"} -func (ec *executionContext) _DeleteServiceAccountTokenPayload(ctx context.Context, sel ast.SelectionSet, obj *serviceaccount.DeleteServiceAccountTokenPayload) graphql.Marshaler { - fields := graphql.CollectFields(ec.OperationContext, sel, deleteServiceAccountTokenPayloadImplementors) +func (ec *executionContext) _EnableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, obj *team.EnableTeamFeaturePayload) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, enableTeamFeaturePayloadImplementors) out := graphql.NewFieldSet(fields) deferred := make(map[string]*graphql.FieldSet) for i, field := range fields { switch field.Name { case "__typename": - out.Values[i] = graphql.MarshalString("DeleteServiceAccountTokenPayload") - case "serviceAccount": - out.Values[i] = ec._DeleteServiceAccountTokenPayload_serviceAccount(ctx, field, obj) - case "serviceAccountTokenDeleted": - out.Values[i] = ec._DeleteServiceAccountTokenPayload_serviceAccountTokenDeleted(ctx, field, obj) + out.Values[i] = graphql.MarshalString("EnableTeamFeaturePayload") + case "team": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._EnableTeamFeaturePayload_team(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "feature": + out.Values[i] = ec._EnableTeamFeaturePayload_feature(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } + case "env": + out.Values[i] = ec._EnableTeamFeaturePayload_env(ctx, field, obj) + if out.Values[i] == graphql.Null { + atomic.AddUint32(&out.Invalids, 1) + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -31749,6 +32662,20 @@ func (ec *executionContext) _Mutation(ctx context.Context, sel ast.SelectionSet) if out.Values[i] == graphql.Null { out.Invalids++ } + case "enableTeamFeature": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_enableTeamFeature(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "disableTeamFeature": + out.Values[i] = ec.OperationContext.RootResolverMiddleware(innerCtx, func(ctx context.Context) (res graphql.Marshaler) { + return ec._Mutation_disableTeamFeature(ctx, field) + }) + if out.Values[i] == graphql.Null { + out.Invalids++ + } default: panic("unknown field " + strconv.Quote(field.Name)) } @@ -36295,6 +37222,42 @@ func (ec *executionContext) _Team(ctx context.Context, sel ast.SelectionSet, obj continue } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) + case "features": + field := field + + innerFunc := func(ctx context.Context, fs *graphql.FieldSet) (res graphql.Marshaler) { + defer func() { + if r := recover(); r != nil { + ec.Error(ctx, ec.Recover(ctx, r)) + } + }() + res = ec._Team_features(ctx, field, obj) + if res == graphql.Null { + atomic.AddUint32(&fs.Invalids, 1) + } + return res + } + + if field.Deferrable != nil { + dfs, ok := deferred[field.Deferrable.Label] + di := 0 + if ok { + dfs.AddField(field) + di = len(dfs.Values) - 1 + } else { + dfs = graphql.NewFieldSet([]graphql.CollectedField{field}) + deferred[field.Deferrable.Label] = dfs + } + dfs.Concurrently(di, func(ctx context.Context) graphql.Marshaler { + return innerFunc(ctx, dfs) + }) + + // don't run the out.Concurrently() call below + out.Values[i] = graphql.Null + continue + } + out.Concurrently(i, func(ctx context.Context) graphql.Marshaler { return innerFunc(ctx, out) }) case "activityLog": field := field @@ -36623,6 +37586,50 @@ func (ec *executionContext) _TeamEdge(ctx context.Context, sel ast.SelectionSet, return out } +var teamFeatureImplementors = []string{"TeamFeature"} + +func (ec *executionContext) _TeamFeature(ctx context.Context, sel ast.SelectionSet, obj *team.TeamFeature) graphql.Marshaler { + fields := graphql.CollectFields(ec.OperationContext, sel, teamFeatureImplementors) + + out := graphql.NewFieldSet(fields) + deferred := make(map[string]*graphql.FieldSet) + for i, field := range fields { + switch field.Name { + case "__typename": + out.Values[i] = graphql.MarshalString("TeamFeature") + case "name": + out.Values[i] = ec._TeamFeature_name(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + case "env": + out.Values[i] = ec._TeamFeature_env(ctx, field, obj) + if out.Values[i] == graphql.Null { + out.Invalids++ + } + default: + panic("unknown field " + strconv.Quote(field.Name)) + } + } + out.Dispatch(ctx) + if out.Invalids > 0 { + return graphql.Null + } + + atomic.AddInt32(&ec.Deferred, int32(len(deferred))) + + for label, dfs := range deferred { + ec.ProcessDeferredGroup(graphql.DeferredGroup{ + Label: label, + Path: graphql.GetPath(ctx), + FieldSet: dfs, + Context: ctx, + }) + } + + return out +} + var teamMemberImplementors = []string{"TeamMember"} func (ec *executionContext) _TeamMember(ctx context.Context, sel ast.SelectionSet, obj *team.TeamMember) graphql.Marshaler { @@ -38877,11 +39884,49 @@ func (ec *executionContext) unmarshalNDisableReconcilerInput2githubᚗcomᚋstat return res, graphql.ErrorOnPath(ctx, err) } +func (ec *executionContext) unmarshalNDisableTeamFeatureInput2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐDisableTeamFeatureInput(ctx context.Context, v any) (team.DisableTeamFeatureInput, error) { + res, err := ec.unmarshalInputDisableTeamFeatureInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNDisableTeamFeaturePayload2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐDisableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, v team.DisableTeamFeaturePayload) graphql.Marshaler { + return ec._DisableTeamFeaturePayload(ctx, sel, &v) +} + +func (ec *executionContext) marshalNDisableTeamFeaturePayload2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐDisableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, v *team.DisableTeamFeaturePayload) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + graphql.AddErrorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._DisableTeamFeaturePayload(ctx, sel, v) +} + func (ec *executionContext) unmarshalNEnableReconcilerInput2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋreconcilerᚐEnableReconcilerInput(ctx context.Context, v any) (reconciler.EnableReconcilerInput, error) { res, err := ec.unmarshalInputEnableReconcilerInput(ctx, v) return res, graphql.ErrorOnPath(ctx, err) } +func (ec *executionContext) unmarshalNEnableTeamFeatureInput2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐEnableTeamFeatureInput(ctx context.Context, v any) (team.EnableTeamFeatureInput, error) { + res, err := ec.unmarshalInputEnableTeamFeatureInput(ctx, v) + return res, graphql.ErrorOnPath(ctx, err) +} + +func (ec *executionContext) marshalNEnableTeamFeaturePayload2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐEnableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, v team.EnableTeamFeaturePayload) graphql.Marshaler { + return ec._EnableTeamFeaturePayload(ctx, sel, &v) +} + +func (ec *executionContext) marshalNEnableTeamFeaturePayload2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐEnableTeamFeaturePayload(ctx context.Context, sel ast.SelectionSet, v *team.EnableTeamFeaturePayload) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + graphql.AddErrorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._EnableTeamFeaturePayload(ctx, sel, v) +} + func (ec *executionContext) marshalNFeatures2githubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋfeatureᚐFeatures(ctx context.Context, sel ast.SelectionSet, v feature.Features) graphql.Marshaler { return ec._Features(ctx, sel, &v) } @@ -40137,6 +41182,32 @@ func (ec *executionContext) marshalNTeamEdge2ᚕgithubᚗcomᚋstatisticsnorway return ret } +func (ec *executionContext) marshalNTeamFeature2ᚕᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeamFeatureᚄ(ctx context.Context, sel ast.SelectionSet, v []*team.TeamFeature) graphql.Marshaler { + ret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler { + fc := graphql.GetFieldContext(ctx) + fc.Result = &v[i] + return ec.marshalNTeamFeature2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeamFeature(ctx, sel, v[i]) + }) + + for _, e := range ret { + if e == graphql.Null { + return graphql.Null + } + } + + return ret +} + +func (ec *executionContext) marshalNTeamFeature2ᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeamFeature(ctx context.Context, sel ast.SelectionSet, v *team.TeamFeature) graphql.Marshaler { + if v == nil { + if !graphql.HasFieldError(ctx, graphql.GetFieldContext(ctx)) { + graphql.AddErrorf(ctx, "the requested element is null which the schema does not allow") + } + return graphql.Null + } + return ec._TeamFeature(ctx, sel, v) +} + func (ec *executionContext) marshalNTeamMember2ᚕᚖgithubᚗcomᚋstatisticsnorwayᚋdaplaᚑctrlᚋapiᚋinternalᚋteamᚐTeamMemberᚄ(ctx context.Context, sel ast.SelectionSet, v []*team.TeamMember) graphql.Marshaler { ret := graphql.MarshalSliceConcurrently(ctx, len(v), 0, false, func(ctx context.Context, i int) graphql.Marshaler { fc := graphql.GetFieldContext(ctx) diff --git a/api/internal/graph/schema/teams.graphqls b/api/internal/graph/schema/teams.graphqls index 2d71016..03264b7 100644 --- a/api/internal/graph/schema/teams.graphqls +++ b/api/internal/graph/schema/teams.graphqls @@ -67,6 +67,10 @@ extend type Mutation { This lets section managers delegate access management to up to two other people. """ removeTeamAccessManager(input: RemoveTeamAccessManagerInput!): RemoveTeamAccessManagerPayload! + + enableTeamFeature(input: EnableTeamFeatureInput!): EnableTeamFeaturePayload! + + disableTeamFeature(input: DisableTeamFeatureInput!): DisableTeamFeaturePayload! } """ @@ -203,6 +207,14 @@ type Team implements Node { "The access managers for the team." accessManagers: [TeamAccessManager!]! + + features: [TeamFeature!]! +} + +type TeamFeature { + name: String! + + env: String! } type TeamMember { @@ -250,6 +262,24 @@ type RemoveTeamAccessManagerPayload { user: User! } +type EnableTeamFeaturePayload { + team: Team! + + "" + feature: String! + + env: String! +} + +type DisableTeamFeaturePayload { + team: Team! + + "" + feature: String! + + env: String! +} + type TeamConnection { "Pagination information." pageInfo: PageInfo! @@ -365,6 +395,36 @@ input RemoveTeamAccessManagerInput { userEmail: String! } +input EnableTeamFeatureInput { + "Slug of the team to set access managers for." + teamSlug: Slug! + + """ + Feature name + """ + feature: String! + + """ + Environment + """ + env: String! +} + +input DisableTeamFeatureInput { + "Slug of the team to set access managers for." + teamSlug: Slug! + + """ + Feature name + """ + feature: String! + + """ + Environment + """ + env: String! +} + "Ordering options when fetching teams." input TeamOrder { "The field to order items by." diff --git a/api/internal/graph/teams.resolvers.go b/api/internal/graph/teams.resolvers.go index 4b179e1..8e8bb52 100644 --- a/api/internal/graph/teams.resolvers.go +++ b/api/internal/graph/teams.resolvers.go @@ -26,6 +26,14 @@ func (r *addTeamAccessManagerPayloadResolver) User(ctx context.Context, obj *tea return user.Get(ctx, obj.UserId) } +func (r *disableTeamFeaturePayloadResolver) Team(ctx context.Context, obj *team.DisableTeamFeaturePayload) (*team.Team, error) { + return team.Get(ctx, obj.TeamSlug) +} + +func (r *enableTeamFeaturePayloadResolver) Team(ctx context.Context, obj *team.EnableTeamFeaturePayload) (*team.Team, error) { + return team.Get(ctx, obj.TeamSlug) +} + func (r *mutationResolver) CreateTeam(ctx context.Context, input team.CreateTeamInput) (*team.CreateTeamPayload, error) { actor := authz.ActorFromContext(ctx) @@ -159,6 +167,30 @@ func (r *mutationResolver) RemoveTeamAccessManager(ctx context.Context, input te }, nil } +func (r *mutationResolver) EnableTeamFeature(ctx context.Context, input team.EnableTeamFeatureInput) (*team.EnableTeamFeaturePayload, error) { + if err := team.EnableTeamFeature(ctx, input.TeamSlug, input.Feature, input.Env); err != nil { + return nil, err + } + + return &team.EnableTeamFeaturePayload{ + TeamSlug: input.TeamSlug, + Feature: input.Feature, + Env: input.Env, + }, nil +} + +func (r *mutationResolver) DisableTeamFeature(ctx context.Context, input team.DisableTeamFeatureInput) (*team.DisableTeamFeaturePayload, error) { + if err := team.DisableTeamFeature(ctx, input.TeamSlug, input.Feature, input.Env); err != nil { + return nil, err + } + + return &team.DisableTeamFeaturePayload{ + TeamSlug: input.TeamSlug, + Feature: input.Feature, + Env: input.Env, + }, nil +} + func (r *queryResolver) Teams(ctx context.Context, first *int, after *pagination.Cursor, last *int, before *pagination.Cursor, orderBy *team.TeamOrder) (*pagination.Connection[*team.Team], error) { page, err := pagination.ParsePage(first, after, last, before) if err != nil { @@ -243,6 +275,10 @@ func (r *teamResolver) AccessManagers(ctx context.Context, obj *team.Team) ([]*t return team.GetAccessManagers(ctx, obj.Slug) } +func (r *teamResolver) Features(ctx context.Context, obj *team.Team) ([]*team.TeamFeature, error) { + return team.GetTeamFeatures(ctx, obj.Slug) +} + func (r *teamAccessManagerResolver) Team(ctx context.Context, obj *team.TeamAccessManager) (*team.Team, error) { return team.Get(ctx, obj.TeamSlug) } @@ -275,6 +311,14 @@ func (r *Resolver) AddTeamAccessManagerPayload() gengql.AddTeamAccessManagerPayl return &addTeamAccessManagerPayloadResolver{r} } +func (r *Resolver) DisableTeamFeaturePayload() gengql.DisableTeamFeaturePayloadResolver { + return &disableTeamFeaturePayloadResolver{r} +} + +func (r *Resolver) EnableTeamFeaturePayload() gengql.EnableTeamFeaturePayloadResolver { + return &enableTeamFeaturePayloadResolver{r} +} + func (r *Resolver) RemoveTeamAccessManagerPayload() gengql.RemoveTeamAccessManagerPayloadResolver { return &removeTeamAccessManagerPayloadResolver{r} } @@ -297,6 +341,8 @@ func (r *Resolver) TeamRoleRevokedActivityLogEntryData() gengql.TeamRoleRevokedA type ( addTeamAccessManagerPayloadResolver struct{ *Resolver } + disableTeamFeaturePayloadResolver struct{ *Resolver } + enableTeamFeaturePayloadResolver struct{ *Resolver } removeTeamAccessManagerPayloadResolver struct{ *Resolver } teamResolver struct{ *Resolver } teamAccessManagerResolver struct{ *Resolver } diff --git a/api/internal/team/model.go b/api/internal/team/model.go index 903ae8d..a181927 100644 --- a/api/internal/team/model.go +++ b/api/internal/team/model.go @@ -372,6 +372,18 @@ type RemoveTeamAccessManagerInput struct { UserId uuid.UUID `json:"-"` } +type EnableTeamFeatureInput struct { + TeamSlug slug.Slug `json:"teamSlug"` + Feature string `json:"feature"` + Env string `json:"env"` +} + +type DisableTeamFeatureInput struct { + TeamSlug slug.Slug `json:"teamSlug"` + Feature string `json:"feature"` + Env string `json:"env"` +} + type CreateTeamPayload struct { Team *Team `json:"team"` } @@ -398,6 +410,23 @@ type RequestTeamDeletionPayload struct { Key *TeamDeleteKey `json:"key"` } +type EnableTeamFeaturePayload struct { + TeamSlug slug.Slug `json:"teamSlug"` + Feature string `json:"feature"` + Env string `json:"env"` +} + +type DisableTeamFeaturePayload struct { + TeamSlug slug.Slug `json:"teamSlug"` + Feature string `json:"feature"` + Env string `json:"env"` +} + +type TeamFeature struct { + Name string `json:"name"` + Env string `json:"env"` +} + type TeamDeleteKey struct { KeyUUID uuid.UUID `json:"key"` CreatedAt time.Time `json:"createdAt"` diff --git a/api/internal/team/queries.go b/api/internal/team/queries.go index b40dcef..2b62893 100644 --- a/api/internal/team/queries.go +++ b/api/internal/team/queries.go @@ -296,6 +296,39 @@ func ConfirmDeleteKey(ctx context.Context, teamSlug slug.Slug, deleteKey uuid.UU }) } +func EnableTeamFeature(ctx context.Context, teamSlug slug.Slug, featureName string, envName string) error { + return db(ctx).EnableTeamFeature(ctx, teamsql.EnableTeamFeatureParams{ + TeamSlug: teamSlug, + Name: featureName, + Env: envName, + }) +} + +func DisableTeamFeature(ctx context.Context, teamSlug slug.Slug, featureName string, envName string) error { + return db(ctx).DisableTeamFeature(ctx, teamsql.DisableTeamFeatureParams{ + TeamSlug: teamSlug, + Name: featureName, + Env: envName, + }) +} + +func GetTeamFeatures(ctx context.Context, teamSlug slug.Slug) ([]*TeamFeature, error) { + fs, err := db(ctx).GetFeaturesForTeam(ctx, teamSlug) + if err != nil { + return nil, err + } + + features := make([]*TeamFeature, 0, len(fs)) + for _, row := range fs { + features = append(features, &TeamFeature{ + Name: row.TeamFeature.Name, + Env: row.TeamFeature.Env, + }) + } + + return features, nil +} + func UserIsOwner(ctx context.Context, teamSlug slug.Slug, userID uuid.UUID) (bool, error) { return db(ctx).UserIsOwner(ctx, teamsql.UserIsOwnerParams{ UserID: userID, diff --git a/api/internal/team/queries/team_feature.sql b/api/internal/team/queries/team_feature.sql new file mode 100644 index 0000000..b63361b --- /dev/null +++ b/api/internal/team/queries/team_feature.sql @@ -0,0 +1,26 @@ +-- name: EnableTeamFeature :exec +INSERT INTO + team_features (team_slug, name, env) +VALUES + (@team_slug, @name, @env) +; + +-- name: DisableTeamFeature :exec +DELETE FROM + team_features +WHERE + team_slug = @team_slug + AND name = @name + AND env = @env +; + +-- name: GetFeaturesForTeam :many +SELECT + sqlc.embed(team_features) +FROM + team_features +WHERE + team_slug = @team_slug +ORDER BY + name ASC +; diff --git a/api/internal/team/teamsql/models.go b/api/internal/team/teamsql/models.go index 8836fdc..2bf1c81 100644 --- a/api/internal/team/teamsql/models.go +++ b/api/internal/team/teamsql/models.go @@ -25,3 +25,9 @@ type TeamDeleteKey struct { CreatedBy uuid.UUID ConfirmedAt pgtype.Timestamptz } + +type TeamFeature struct { + TeamSlug slug.Slug + Name string + Env string +} diff --git a/api/internal/team/teamsql/querier.go b/api/internal/team/teamsql/querier.go index 40141df..b7d303c 100644 --- a/api/internal/team/teamsql/querier.go +++ b/api/internal/team/teamsql/querier.go @@ -14,10 +14,13 @@ type Querier interface { ConfirmDeleteKey(ctx context.Context, key uuid.UUID) error Create(ctx context.Context, arg CreateParams) (*Team, error) CreateDeleteKey(ctx context.Context, arg CreateDeleteKeyParams) (*TeamDeleteKey, error) + DisableTeamFeature(ctx context.Context, arg DisableTeamFeatureParams) error + EnableTeamFeature(ctx context.Context, arg EnableTeamFeatureParams) error Exists(ctx context.Context, argSlug slug.Slug) (bool, error) Get(ctx context.Context, argSlug slug.Slug) (*Team, error) GetAccessManagers(ctx context.Context, teamSlug slug.Slug) ([]uuid.UUID, error) GetDeleteKey(ctx context.Context, arg GetDeleteKeyParams) (*TeamDeleteKey, error) + GetFeaturesForTeam(ctx context.Context, teamSlug slug.Slug) ([]*GetFeaturesForTeamRow, error) GetTeamMember(ctx context.Context, arg GetTeamMemberParams) (*GetTeamMemberRow, error) List(ctx context.Context, arg ListParams) ([]*ListRow, error) ListAllForSearch(ctx context.Context) ([]*ListAllForSearchRow, error) diff --git a/api/internal/team/teamsql/team_feature.sql.go b/api/internal/team/teamsql/team_feature.sql.go new file mode 100644 index 0000000..e63601b --- /dev/null +++ b/api/internal/team/teamsql/team_feature.sql.go @@ -0,0 +1,83 @@ +// Code generated by sqlc. DO NOT EDIT. +// source: team_feature.sql + +package teamsql + +import ( + "context" + + "github.com/statisticsnorway/dapla-ctrl/api/internal/slug" +) + +const disableTeamFeature = `-- name: DisableTeamFeature :exec +DELETE FROM + team_features +WHERE + team_slug = $1 + AND name = $2 + AND env = $3 +` + +type DisableTeamFeatureParams struct { + TeamSlug slug.Slug + Name string + Env string +} + +func (q *Queries) DisableTeamFeature(ctx context.Context, arg DisableTeamFeatureParams) error { + _, err := q.db.Exec(ctx, disableTeamFeature, arg.TeamSlug, arg.Name, arg.Env) + return err +} + +const enableTeamFeature = `-- name: EnableTeamFeature :exec +INSERT INTO + team_features (team_slug, name, env) +VALUES + ($1, $2, $3) +` + +type EnableTeamFeatureParams struct { + TeamSlug slug.Slug + Name string + Env string +} + +func (q *Queries) EnableTeamFeature(ctx context.Context, arg EnableTeamFeatureParams) error { + _, err := q.db.Exec(ctx, enableTeamFeature, arg.TeamSlug, arg.Name, arg.Env) + return err +} + +const getFeaturesForTeam = `-- name: GetFeaturesForTeam :many +SELECT + team_features.team_slug, team_features.name, team_features.env +FROM + team_features +WHERE + team_slug = $1 +ORDER BY + name ASC +` + +type GetFeaturesForTeamRow struct { + TeamFeature TeamFeature +} + +func (q *Queries) GetFeaturesForTeam(ctx context.Context, teamSlug slug.Slug) ([]*GetFeaturesForTeamRow, error) { + rows, err := q.db.Query(ctx, getFeaturesForTeam, teamSlug) + if err != nil { + return nil, err + } + defer rows.Close() + items := []*GetFeaturesForTeamRow{} + for rows.Next() { + var i GetFeaturesForTeamRow + if err := rows.Scan(&i.TeamFeature.TeamSlug, &i.TeamFeature.Name, &i.TeamFeature.Env); err != nil { + return nil, err + } + items = append(items, &i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} diff --git a/reconcilers/internal/cmd/reconciler/main.go b/reconcilers/internal/cmd/reconciler/main.go index dc8d884..045f977 100644 --- a/reconcilers/internal/cmd/reconciler/main.go +++ b/reconcilers/internal/cmd/reconciler/main.go @@ -9,6 +9,7 @@ import ( "syscall" "time" + "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/dummy" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/entraid/gcpsyncer" entraidreconciler "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/entraid/group" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/github/team" @@ -132,6 +133,8 @@ func run(ctx context.Context, cfg *config.Config, log logrus.FieldLogger) error reconcilerManager.AddReconciler(githubTeam) } + reconcilerManager.AddReconciler(dummy.New()) + log.WithField("duration", time.Since(start).String()).Debug("Added reconcilers to manager") if err := reconcilerManager.RegisterReconcilersWithAPI(ctx); err != nil { diff --git a/reconcilers/internal/reconcilers/dummy/reconciler.go b/reconcilers/internal/reconcilers/dummy/reconciler.go new file mode 100644 index 0000000..69582a9 --- /dev/null +++ b/reconcilers/internal/reconcilers/dummy/reconciler.go @@ -0,0 +1,56 @@ +package dummy + +import ( + "context" + "fmt" + "os" + "time" + + "github.com/sirupsen/logrus" + "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient" + "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient/protoapi" +) + +const ( + reconcilerName = "stat:dummy" +) + +type reconciler struct{} + +func New() *reconciler { + return &reconciler{} +} + +// Configuration implements [reconcilers.Reconciler]. +func (r *reconciler) Configuration() *protoapi.NewReconciler { + return &protoapi.NewReconciler{ + Name: r.Name(), + DisplayName: "Our new dummy reconciler", + Description: "n/a", + } +} + +// Name implements [reconcilers.Reconciler]. +func (r *reconciler) Name() string { + return reconcilerName +} + +// Reconcile implements [reconcilers.Reconciler]. +func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { + f, err := os.Create("teams/" + daplaTeam.Slug) + if err != nil { + return fmt.Errorf("create team file: %w", err) + } + + formattedDate := time.Now().Format("15:04:05 02 01 2006") + if _, err := f.Write([]byte(formattedDate)); err != nil { + return err + } + + return nil +} + +// Delete implements [reconcilers.Reconciler]. +func (r *reconciler) Delete(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { + panic("unimplemented") +} diff --git a/reconcilers/teams/a200-stoetteteam b/reconcilers/teams/a200-stoetteteam new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/a200-stoetteteam @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/a300-gis-pii b/reconcilers/teams/a300-gis-pii new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/a300-gis-pii @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/aordning-register b/reconcilers/teams/aordning-register new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/aordning-register @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-aku b/reconcilers/teams/arbmark-aku new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/arbmark-aku @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-register b/reconcilers/teams/arbmark-register new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/arbmark-register @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-skjema b/reconcilers/teams/arbmark-skjema new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/arbmark-skjema @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbulykker b/reconcilers/teams/arbulykker new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/arbulykker @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/areal b/reconcilers/teams/areal new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/areal @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arkitektur b/reconcilers/teams/arkitektur new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/arkitektur @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barnevern b/reconcilers/teams/barnevern new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/barnevern @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barneverng b/reconcilers/teams/barneverng new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/barneverng @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barneverni b/reconcilers/teams/barneverni new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/barneverni @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-analyse b/reconcilers/teams/bef-analyse new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-analyse @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-bosted b/reconcilers/teams/bef-bosted new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-bosted @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-husholdning b/reconcilers/teams/bef-husholdning new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-husholdning @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-oppdrag b/reconcilers/teams/bef-oppdrag new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-oppdrag @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-regional b/reconcilers/teams/bef-regional new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-regional @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-statistikk b/reconcilers/teams/bef-statistikk new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-statistikk @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-valg b/reconcilers/teams/bef-valg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bef-valg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/befstat b/reconcilers/teams/befstat new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/befstat @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/betfor b/reconcilers/teams/betfor new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/betfor @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bilpark-nybil b/reconcilers/teams/bilpark-nybil new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bilpark-nybil @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bki b/reconcilers/teams/bki new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bki @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bof-stedfesting b/reconcilers/teams/bof-stedfesting new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bof-stedfesting @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/boforholdregister b/reconcilers/teams/boforholdregister new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/boforholdregister @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bpi b/reconcilers/teams/bpi new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bpi @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/brann-kostra b/reconcilers/teams/brann-kostra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/brann-kostra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bygg b/reconcilers/teams/bygg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/bygg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-felles b/reconcilers/teams/dapla-felles new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-felles @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-ffunk b/reconcilers/teams/dapla-ffunk new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-ffunk @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-lab b/reconcilers/teams/dapla-lab new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-lab @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-metadata b/reconcilers/teams/dapla-metadata new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-metadata @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-onprem-vpn b/reconcilers/teams/dapla-onprem-vpn new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-onprem-vpn @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-platform b/reconcilers/teams/dapla-platform new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-platform @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-pseudo b/reconcilers/teams/dapla-pseudo new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-pseudo @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-skyinfra b/reconcilers/teams/dapla-skyinfra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-skyinfra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-stat b/reconcilers/teams/dapla-stat new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dapla-stat @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-alf b/reconcilers/teams/datafangst-alf new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-alf @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-altinn b/reconcilers/teams/datafangst-altinn new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-altinn @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-blaise b/reconcilers/teams/datafangst-blaise new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-blaise @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-innfin b/reconcilers/teams/datafangst-innfin new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-innfin @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-kart b/reconcilers/teams/datafangst-kart new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-kart @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-m2m b/reconcilers/teams/datafangst-m2m new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-m2m @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-person b/reconcilers/teams/datafangst-person new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-person @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-planle b/reconcilers/teams/datafangst-planle new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/datafangst-planle @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dftjen b/reconcilers/teams/dftjen new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/dftjen @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/el-pris-volum b/reconcilers/teams/el-pris-volum new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/el-pris-volum @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energ-ind-korttid b/reconcilers/teams/energ-ind-korttid new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energ-ind-korttid @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-ereb b/reconcilers/teams/energi-ereb new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energi-ereb @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-fjernvarme b/reconcilers/teams/energi-fjernvarme new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energi-fjernvarme @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-industri b/reconcilers/teams/energi-industri new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energi-industri @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-petrole b/reconcilers/teams/energi-petrole new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energi-petrole @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-rapp b/reconcilers/teams/energi-rapp new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/energi-rapp @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/etlev b/reconcilers/teams/etlev new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/etlev @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/famvern b/reconcilers/teams/famvern new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/famvern @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/fastlegetj b/reconcilers/teams/fastlegetj new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/fastlegetj @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finmark b/reconcilers/teams/finmark new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/finmark @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finpop b/reconcilers/teams/finpop new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/finpop @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finregn b/reconcilers/teams/finregn new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/finregn @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/folksim b/reconcilers/teams/folksim new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/folksim @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-isolert b/reconcilers/teams/forbruk-isolert new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forbruk-isolert @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-stat b/reconcilers/teams/forbruk-stat new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forbruk-stat @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-transak b/reconcilers/teams/forbruk-transak new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forbruk-transak @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/fordelingsregnska b/reconcilers/teams/fordelingsregnska new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/fordelingsregnska @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forsk-mismatch b/reconcilers/teams/forsk-mismatch new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forsk-mismatch @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forsk-nhm b/reconcilers/teams/forsk-nhm new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forsk-nhm @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-forsk b/reconcilers/teams/forskteknar-forsk new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forskteknar-forsk @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-narin b/reconcilers/teams/forskteknar-narin new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forskteknar-narin @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-tek b/reconcilers/teams/forskteknar-tek new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/forskteknar-tek @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/funkhem b/reconcilers/teams/funkhem new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/funkhem @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/hack-fnrleting b/reconcilers/teams/hack-fnrleting new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/hack-fnrleting @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/helseforhold b/reconcilers/teams/helseforhold new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/helseforhold @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/helsetjko b/reconcilers/teams/helsetjko new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/helsetjko @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/infoforvaltning b/reconcilers/teams/infoforvaltning new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/infoforvaltning @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/inntekt-hushold b/reconcilers/teams/inntekt-hushold new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/inntekt-hushold @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/itinfra-bakkesyst b/reconcilers/teams/itinfra-bakkesyst new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/itinfra-bakkesyst @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/itinfra-ks b/reconcilers/teams/itinfra-ks new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/itinfra-ks @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/keycloak b/reconcilers/teams/keycloak new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/keycloak @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kombolig-kostra b/reconcilers/teams/kombolig-kostra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kombolig-kostra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kosthald b/reconcilers/teams/kosthald new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kosthald @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kostra b/reconcilers/teams/kostra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kostra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/krim-og-rett b/reconcilers/teams/krim-og-rett new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/krim-og-rett @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-biblmuseum b/reconcilers/teams/kultur-biblmuseum new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kultur-biblmuseum @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-kultmed b/reconcilers/teams/kultur-kultmed new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kultur-kultmed @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-trokirke b/reconcilers/teams/kultur-trokirke new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kultur-trokirke @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kurs-fra-kilde b/reconcilers/teams/kurs-fra-kilde new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/kurs-fra-kilde @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/laerermod b/reconcilers/teams/laerermod new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/laerermod @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/lb-sky b/reconcilers/teams/lb-sky new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/lb-sky @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar b/reconcilers/teams/levekaar new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/levekaar @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar-arbeid b/reconcilers/teams/levekaar-arbeid new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/levekaar-arbeid @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar-barn b/reconcilers/teams/levekaar-barn new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/levekaar-barn @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/livskvalitet b/reconcilers/teams/livskvalitet new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/livskvalitet @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/lotte b/reconcilers/teams/lotte new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/lotte @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/makro-demec b/reconcilers/teams/makro-demec new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/makro-demec @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/metode-naceomlegg b/reconcilers/teams/metode-naceomlegg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/metode-naceomlegg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/metode-sesong b/reconcilers/teams/metode-sesong new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/metode-sesong @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/microdata b/reconcilers/teams/microdata new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/microdata @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/microdata-no b/reconcilers/teams/microdata-no new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/microdata-no @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/mikrodata-oppdrag b/reconcilers/teams/mikrodata-oppdrag new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/mikrodata-oppdrag @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/naturregnskap b/reconcilers/teams/naturregnskap new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/naturregnskap @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nr b/reconcilers/teams/nr new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/nr @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nr-likningsmodul b/reconcilers/teams/nr-likningsmodul new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/nr-likningsmodul @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nspek b/reconcilers/teams/nspek new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/nspek @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/off-fin b/reconcilers/teams/off-fin new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/off-fin @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/opera-forretning b/reconcilers/teams/opera-forretning new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/opera-forretning @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/papis b/reconcilers/teams/papis new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/papis @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pasient b/reconcilers/teams/pasient new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/pasient @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-chatbot b/reconcilers/teams/play-chatbot new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-chatbot @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-datafangst b/reconcilers/teams/play-datafangst new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-datafangst @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-dba b/reconcilers/teams/play-dba new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-dba @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-enhjoern-a b/reconcilers/teams/play-enhjoern-a new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-enhjoern-a @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-ffunk-edit-a b/reconcilers/teams/play-ffunk-edit-a new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-ffunk-edit-a @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-ffunk-edit-b b/reconcilers/teams/play-ffunk-edit-b new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-ffunk-edit-b @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-foeniks-a b/reconcilers/teams/play-foeniks-a new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-foeniks-a @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-lab b/reconcilers/teams/play-lab new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-lab @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-mabl-test b/reconcilers/teams/play-mabl-test new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-mabl-test @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-obr b/reconcilers/teams/play-obr new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-obr @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-obr-b b/reconcilers/teams/play-obr-b new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-obr-b @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-skatt b/reconcilers/teams/play-skatt new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-skatt @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-skyinfra-a b/reconcilers/teams/play-skyinfra-a new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/play-skyinfra-a @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pleie b/reconcilers/teams/pleie new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/pleie @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/poc-composer b/reconcilers/teams/poc-composer new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/poc-composer @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pop-lb-eiendom b/reconcilers/teams/pop-lb-eiendom new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/pop-lb-eiendom @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pop-mat-gb b/reconcilers/teams/pop-mat-gb new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/pop-mat-gb @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-j-reg b/reconcilers/teams/primaer-j-reg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/primaer-j-reg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-j-skjema b/reconcilers/teams/primaer-j-skjema new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/primaer-j-skjema @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-jakt b/reconcilers/teams/primaer-jakt new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/primaer-jakt @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/prisstat b/reconcilers/teams/prisstat new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/prisstat @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/proj-aiml-edit b/reconcilers/teams/proj-aiml-edit new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/proj-aiml-edit @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pseudo-comp-test b/reconcilers/teams/pseudo-comp-test new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/pseudo-comp-test @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-a-ordningen b/reconcilers/teams/reg-a-ordningen new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/reg-a-ordningen @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-bof b/reconcilers/teams/reg-bof new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/reg-bof @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-freg b/reconcilers/teams/reg-freg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/reg-freg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-matrikkel b/reconcilers/teams/reg-matrikkel new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/reg-matrikkel @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reiseliv-korttid b/reconcilers/teams/reiseliv-korttid new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/reiseliv-korttid @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/royk b/reconcilers/teams/royk new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/royk @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sikkerhetssenter b/reconcilers/teams/sikkerhetssenter new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/sikkerhetssenter @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sirius-editering b/reconcilers/teams/sirius-editering new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/sirius-editering @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/skatt-naering b/reconcilers/teams/skatt-naering new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/skatt-naering @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/skatt-person b/reconcilers/teams/skatt-person new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/skatt-person @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sosial-kvp b/reconcilers/teams/sosial-kvp new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/sosial-kvp @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sosialhjelpk b/reconcilers/teams/sosialhjelpk new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/sosialhjelpk @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/speshelse b/reconcilers/teams/speshelse new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/speshelse @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/ssbno b/reconcilers/teams/ssbno new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/ssbno @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/stat-skog b/reconcilers/teams/stat-skog new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/stat-skog @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/statbank b/reconcilers/teams/statbank new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/statbank @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-arbkost b/reconcilers/teams/strukt-arbkost new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/strukt-arbkost @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-kraftnarin b/reconcilers/teams/strukt-kraftnarin new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/strukt-kraftnarin @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-miljoe b/reconcilers/teams/strukt-miljoe new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/strukt-miljoe @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-mva b/reconcilers/teams/strukt-mva new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/strukt-mva @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-naering b/reconcilers/teams/strukt-naering new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/strukt-naering @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sup b/reconcilers/teams/sup new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/sup @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/suv-altinn b/reconcilers/teams/suv-altinn new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/suv-altinn @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tannhelse b/reconcilers/teams/tannhelse new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/tannhelse @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tech-coach b/reconcilers/teams/tech-coach new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/tech-coach @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tidsbruk-survey b/reconcilers/teams/tidsbruk-survey new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/tidsbruk-survey @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tip-tutorials b/reconcilers/teams/tip-tutorials new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/tip-tutorials @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-baat b/reconcilers/teams/transport-baat new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-baat @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-bil b/reconcilers/teams/transport-bil new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-bil @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-fly b/reconcilers/teams/transport-fly new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-fly @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kollekt b/reconcilers/teams/transport-kollekt new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-kollekt @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kostind b/reconcilers/teams/transport-kostind new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-kostind @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kostra b/reconcilers/teams/transport-kostra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-kostra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-lastbil b/reconcilers/teams/transport-lastbil new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/transport-lastbil @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/trygd-person b/reconcilers/teams/trygd-person new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/trygd-person @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/uh-tjenester b/reconcilers/teams/uh-tjenester new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/uh-tjenester @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/uh-varer b/reconcilers/teams/uh-varer new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/uh-varer @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-bhgskole b/reconcilers/teams/utd-bhgskole new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-bhgskole @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-inter b/reconcilers/teams/utd-inter new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-inter @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-kompetanse b/reconcilers/teams/utd-kompetanse new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-kompetanse @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-nudb b/reconcilers/teams/utd-nudb new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-nudb @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-tverr b/reconcilers/teams/utd-tverr new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-tverr @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-uhfagskole b/reconcilers/teams/utd-uhfagskole new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-uhfagskole @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-vg b/reconcilers/teams/utd-vg new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utd-vg @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utslipp-luft b/reconcilers/teams/utslipp-luft new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/utslipp-luft @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-avfall b/reconcilers/teams/var-avfall new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/var-avfall @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-avlop b/reconcilers/teams/var-avlop new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/var-avlop @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-materialstrom b/reconcilers/teams/var-materialstrom new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/var-materialstrom @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-vann-kostra b/reconcilers/teams/var-vann-kostra new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/var-vann-kostra @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/vare-tjen-korttid b/reconcilers/teams/vare-tjen-korttid new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/vare-tjen-korttid @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/verdsetting-bolig b/reconcilers/teams/verdsetting-bolig new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/verdsetting-bolig @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/vof b/reconcilers/teams/vof new file mode 100644 index 0000000..eca5f8b --- /dev/null +++ b/reconcilers/teams/vof @@ -0,0 +1 @@ +13:12:38 08 07 2026 \ No newline at end of file From dcce7d66c31eb5dbe08763375743fd06f965acff Mon Sep 17 00:00:00 2001 From: nicolst <35232838+nicolst@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:17:47 +0200 Subject: [PATCH 2/9] implement protapi --- .../grpc/grpcteam/grpcteamsql/models.go | 6 + .../grpc/grpcteam/grpcteamsql/querier.go | 1 + .../grpc/grpcteam/grpcteamsql/teams.sql.go | 35 ++ api/internal/grpc/grpcteam/queries/teams.sql | 11 + api/internal/grpc/grpcteam/server.go | 18 + .../apiclient/protoapi/mock_teams_server.go | 68 +++ api/pkg/apiclient/protoapi/schema/teams.proto | 14 + api/pkg/apiclient/protoapi/teams.pb.go | 436 ++++++++++++----- api/pkg/apiclient/protoapi/teams_grpc.pb.go | 46 +- .../protoapi/teams_protoopaque.pb.go | 438 +++++++++++++----- .../apiclient/protoapi/mock_teams_server.go | 68 +++ .../pkg/apiclient/protoapi/schema/teams.proto | 14 + .../pkg/apiclient/protoapi/teams.pb.go | 436 ++++++++++++----- .../pkg/apiclient/protoapi/teams_grpc.pb.go | 46 +- .../protoapi/teams_protoopaque.pb.go | 438 +++++++++++++----- 15 files changed, 1611 insertions(+), 464 deletions(-) diff --git a/api/internal/grpc/grpcteam/grpcteamsql/models.go b/api/internal/grpc/grpcteam/grpcteamsql/models.go index 0e5ac4e..0c88a55 100644 --- a/api/internal/grpc/grpcteam/grpcteamsql/models.go +++ b/api/internal/grpc/grpcteam/grpcteamsql/models.go @@ -16,3 +16,9 @@ type Team struct { IsManaged bool HasManualEditing bool } + +type TeamFeature struct { + TeamSlug slug.Slug + Name string + Env string +} diff --git a/api/internal/grpc/grpcteam/grpcteamsql/querier.go b/api/internal/grpc/grpcteam/grpcteamsql/querier.go index 6c62a3d..ecd4521 100644 --- a/api/internal/grpc/grpcteam/grpcteamsql/querier.go +++ b/api/internal/grpc/grpcteam/grpcteamsql/querier.go @@ -13,6 +13,7 @@ type Querier interface { CountGroups(ctx context.Context, teamSlug slug.Slug) (int64, error) Delete(ctx context.Context, argSlug slug.Slug) error Get(ctx context.Context, argSlug slug.Slug) (*Team, error) + GetFeaturesForTeam(ctx context.Context, teamSlug slug.Slug) ([]*GetFeaturesForTeamRow, error) List(ctx context.Context, arg ListParams) ([]*Team, error) ListGroups(ctx context.Context, arg ListGroupsParams) ([]*ListGroupsRow, error) SetLastSuccessfulSync(ctx context.Context, argSlug slug.Slug) error diff --git a/api/internal/grpc/grpcteam/grpcteamsql/teams.sql.go b/api/internal/grpc/grpcteam/grpcteamsql/teams.sql.go index 4e90d0f..2894fb7 100644 --- a/api/internal/grpc/grpcteam/grpcteamsql/teams.sql.go +++ b/api/internal/grpc/grpcteam/grpcteamsql/teams.sql.go @@ -75,6 +75,41 @@ func (q *Queries) Get(ctx context.Context, argSlug slug.Slug) (*Team, error) { return &i, err } +const getFeaturesForTeam = `-- name: GetFeaturesForTeam :many +SELECT + team_features.team_slug, team_features.name, team_features.env +FROM + team_features +WHERE + team_slug = $1 +ORDER BY + name ASC +` + +type GetFeaturesForTeamRow struct { + TeamFeature TeamFeature +} + +func (q *Queries) GetFeaturesForTeam(ctx context.Context, teamSlug slug.Slug) ([]*GetFeaturesForTeamRow, error) { + rows, err := q.db.Query(ctx, getFeaturesForTeam, teamSlug) + if err != nil { + return nil, err + } + defer rows.Close() + items := []*GetFeaturesForTeamRow{} + for rows.Next() { + var i GetFeaturesForTeamRow + if err := rows.Scan(&i.TeamFeature.TeamSlug, &i.TeamFeature.Name, &i.TeamFeature.Env); err != nil { + return nil, err + } + items = append(items, &i) + } + if err := rows.Err(); err != nil { + return nil, err + } + return items, nil +} + const list = `-- name: List :many SELECT slug, display_name, last_successful_sync, delete_key_confirmed_at, section_code, is_managed, has_manual_editing diff --git a/api/internal/grpc/grpcteam/queries/teams.sql b/api/internal/grpc/grpcteam/queries/teams.sql index 1b9b556..5b731c7 100644 --- a/api/internal/grpc/grpcteam/queries/teams.sql +++ b/api/internal/grpc/grpcteam/queries/teams.sql @@ -67,3 +67,14 @@ FROM WHERE team_slug = @team_slug::slug ; + +-- name: GetFeaturesForTeam :many +SELECT + sqlc.embed(team_features) +FROM + team_features +WHERE + team_slug = @team_slug +ORDER BY + name ASC +; diff --git a/api/internal/grpc/grpcteam/server.go b/api/internal/grpc/grpcteam/server.go index 9a72224..d975cc9 100644 --- a/api/internal/grpc/grpcteam/server.go +++ b/api/internal/grpc/grpcteam/server.go @@ -104,6 +104,24 @@ func (t *Server) Groups(ctx context.Context, req *protoapi.ListTeamGroupsRequest return resp, nil } +func (t *Server) GetFeatures(ctx context.Context, team *protoapi.GetFeaturesRequest) (*protoapi.GetFeaturesResponse, error) { + features, err := t.querier.GetFeaturesForTeam(ctx, slug.Slug(team.Slug)) + if err != nil { + return nil, err + } + + resp := &protoapi.GetFeaturesResponse{ + Features: make([]*protoapi.Feature, len(features)), + } + for i, feature := range features { + resp.Features[i] = &protoapi.Feature{ + Name: feature.TeamFeature.Name, + Env: feature.TeamFeature.Env, + } + } + return resp, nil +} + func toProtoTeam(team *grpcteamsql.Team) *protoapi.Team { t := &protoapi.Team{ Slug: team.Slug.String(), diff --git a/api/pkg/apiclient/protoapi/mock_teams_server.go b/api/pkg/apiclient/protoapi/mock_teams_server.go index 8b09447..313a2a3 100644 --- a/api/pkg/apiclient/protoapi/mock_teams_server.go +++ b/api/pkg/apiclient/protoapi/mock_teams_server.go @@ -174,6 +174,74 @@ func (_c *MockTeamsServer_Get_Call) RunAndReturn(run func(context1 context.Conte return _c } +// GetFeatures provides a mock function for the type MockTeamsServer +func (_mock *MockTeamsServer) GetFeatures(context1 context.Context, getFeaturesRequest *GetFeaturesRequest) (*GetFeaturesResponse, error) { + ret := _mock.Called(context1, getFeaturesRequest) + + if len(ret) == 0 { + panic("no return value specified for GetFeatures") + } + + var r0 *GetFeaturesResponse + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error)); ok { + return returnFunc(context1, getFeaturesRequest) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, *GetFeaturesRequest) *GetFeaturesResponse); ok { + r0 = returnFunc(context1, getFeaturesRequest) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*GetFeaturesResponse) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, *GetFeaturesRequest) error); ok { + r1 = returnFunc(context1, getFeaturesRequest) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockTeamsServer_GetFeatures_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFeatures' +type MockTeamsServer_GetFeatures_Call struct { + *mock.Call +} + +// GetFeatures is a helper method to define mock.On call +// - context1 context.Context +// - getFeaturesRequest *GetFeaturesRequest +func (_e *MockTeamsServer_Expecter) GetFeatures(context1 interface{}, getFeaturesRequest interface{}) *MockTeamsServer_GetFeatures_Call { + return &MockTeamsServer_GetFeatures_Call{Call: _e.mock.On("GetFeatures", context1, getFeaturesRequest)} +} + +func (_c *MockTeamsServer_GetFeatures_Call) Run(run func(context1 context.Context, getFeaturesRequest *GetFeaturesRequest)) *MockTeamsServer_GetFeatures_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 *GetFeaturesRequest + if args[1] != nil { + arg1 = args[1].(*GetFeaturesRequest) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockTeamsServer_GetFeatures_Call) Return(getFeaturesResponse *GetFeaturesResponse, err error) *MockTeamsServer_GetFeatures_Call { + _c.Call.Return(getFeaturesResponse, err) + return _c +} + +func (_c *MockTeamsServer_GetFeatures_Call) RunAndReturn(run func(context1 context.Context, getFeaturesRequest *GetFeaturesRequest) (*GetFeaturesResponse, error)) *MockTeamsServer_GetFeatures_Call { + _c.Call.Return(run) + return _c +} + // Groups provides a mock function for the type MockTeamsServer func (_mock *MockTeamsServer) Groups(context1 context.Context, listTeamGroupsRequest *ListTeamGroupsRequest) (*ListTeamGroupsResponse, error) { ret := _mock.Called(context1, listTeamGroupsRequest) diff --git a/api/pkg/apiclient/protoapi/schema/teams.proto b/api/pkg/apiclient/protoapi/schema/teams.proto index 4615013..ecdf6d0 100644 --- a/api/pkg/apiclient/protoapi/schema/teams.proto +++ b/api/pkg/apiclient/protoapi/schema/teams.proto @@ -14,11 +14,17 @@ message Team { optional google.protobuf.Timestamp delete_key_confirmed_at = 3; } +message Feature { + string name = 1; + string env = 2; +} + service Teams { rpc Get(GetTeamRequest) returns (GetTeamResponse) {} rpc List(ListTeamsRequest) returns (ListTeamsResponse) {} rpc Groups(ListTeamGroupsRequest) returns (ListTeamGroupsResponse) {} rpc Delete(DeleteTeamRequest) returns (DeleteTeamResponse) {} + rpc GetFeatures(GetFeaturesRequest) returns (GetFeaturesResponse) {} } message DeleteTeamRequest { @@ -56,6 +62,14 @@ message ListTeamGroupsResponse { PageInfo page_info = 2; } +message GetFeaturesRequest { + string slug = 1; +} + +message GetFeaturesResponse { + repeated Feature features = 1; +} + message TeamGroup { Group group = 1; } diff --git a/api/pkg/apiclient/protoapi/teams.pb.go b/api/pkg/apiclient/protoapi/teams.pb.go index 61fa07c..0cc92b3 100644 --- a/api/pkg/apiclient/protoapi/teams.pb.go +++ b/api/pkg/apiclient/protoapi/teams.pb.go @@ -119,6 +119,77 @@ func (b0 Team_builder) Build() *Team { return m0 } +type Feature struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Env string `protobuf:"bytes,2,opt,name=env,proto3" json:"env,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Feature) Reset() { + *x = Feature{} + mi := &file_teams_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Feature) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Feature) ProtoMessage() {} + +func (x *Feature) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Feature) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Feature) GetEnv() string { + if x != nil { + return x.Env + } + return "" +} + +func (x *Feature) SetName(v string) { + x.Name = v +} + +func (x *Feature) SetEnv(v string) { + x.Env = v +} + +type Feature_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Name string + Env string +} + +func (b0 Feature_builder) Build() *Feature { + m0 := &Feature{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Env = b.Env + return m0 +} + type DeleteTeamRequest struct { state protoimpl.MessageState `protogen:"hybrid.v1"` Slug string `protobuf:"bytes,1,opt,name=slug,proto3" json:"slug,omitempty"` @@ -128,7 +199,7 @@ type DeleteTeamRequest struct { func (x *DeleteTeamRequest) Reset() { *x = DeleteTeamRequest{} - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -140,7 +211,7 @@ func (x *DeleteTeamRequest) String() string { func (*DeleteTeamRequest) ProtoMessage() {} func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +255,7 @@ type DeleteTeamResponse struct { func (x *DeleteTeamResponse) Reset() { *x = DeleteTeamResponse{} - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -196,7 +267,7 @@ func (x *DeleteTeamResponse) String() string { func (*DeleteTeamResponse) ProtoMessage() {} func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -228,7 +299,7 @@ type GetTeamResponse struct { func (x *GetTeamResponse) Reset() { *x = GetTeamResponse{} - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -240,7 +311,7 @@ func (x *GetTeamResponse) String() string { func (*GetTeamResponse) ProtoMessage() {} func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -296,7 +367,7 @@ type GetTeamRequest struct { func (x *GetTeamRequest) Reset() { *x = GetTeamRequest{} - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +379,7 @@ func (x *GetTeamRequest) String() string { func (*GetTeamRequest) ProtoMessage() {} func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +425,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +437,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +496,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -437,7 +508,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -508,7 +579,7 @@ type ListTeamGroupsRequest struct { func (x *ListTeamGroupsRequest) Reset() { *x = ListTeamGroupsRequest{} - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -520,7 +591,7 @@ func (x *ListTeamGroupsRequest) String() string { func (*ListTeamGroupsRequest) ProtoMessage() {} func (x *ListTeamGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -592,7 +663,7 @@ type ListTeamGroupsResponse struct { func (x *ListTeamGroupsResponse) Reset() { *x = ListTeamGroupsResponse{} - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -604,7 +675,7 @@ func (x *ListTeamGroupsResponse) String() string { func (*ListTeamGroupsResponse) ProtoMessage() {} func (x *ListTeamGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -664,6 +735,120 @@ func (b0 ListTeamGroupsResponse_builder) Build() *ListTeamGroupsResponse { return m0 } +type GetFeaturesRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Slug string `protobuf:"bytes,1,opt,name=slug,proto3" json:"slug,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesRequest) Reset() { + *x = GetFeaturesRequest{} + mi := &file_teams_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesRequest) ProtoMessage() {} + +func (x *GetFeaturesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesRequest) GetSlug() string { + if x != nil { + return x.Slug + } + return "" +} + +func (x *GetFeaturesRequest) SetSlug(v string) { + x.Slug = v +} + +type GetFeaturesRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Slug string +} + +func (b0 GetFeaturesRequest_builder) Build() *GetFeaturesRequest { + m0 := &GetFeaturesRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Slug = b.Slug + return m0 +} + +type GetFeaturesResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Features []*Feature `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesResponse) Reset() { + *x = GetFeaturesResponse{} + mi := &file_teams_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesResponse) ProtoMessage() {} + +func (x *GetFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesResponse) GetFeatures() []*Feature { + if x != nil { + return x.Features + } + return nil +} + +func (x *GetFeaturesResponse) SetFeatures(v []*Feature) { + x.Features = v +} + +type GetFeaturesResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Features []*Feature +} + +func (b0 GetFeaturesResponse_builder) Build() *GetFeaturesResponse { + m0 := &GetFeaturesResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Features = b.Features + return m0 +} + type TeamGroup struct { state protoimpl.MessageState `protogen:"hybrid.v1"` Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` @@ -673,7 +858,7 @@ type TeamGroup struct { func (x *TeamGroup) Reset() { *x = TeamGroup{} - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +870,7 @@ func (x *TeamGroup) String() string { func (*TeamGroup) ProtoMessage() {} func (x *TeamGroup) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -752,112 +937,135 @@ var file_teams_proto_rawDesc = string([]byte{ 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x2f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, + 0x75, 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, + 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x40, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x32, 0xee, 0x02, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x67, 0x22, 0x4e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x70, + 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, + 0xd0, 0x03, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teams_proto_goTypes = []any{ (*Team)(nil), // 0: dapla.api.protobuf.Team - (*DeleteTeamRequest)(nil), // 1: dapla.api.protobuf.DeleteTeamRequest - (*DeleteTeamResponse)(nil), // 2: dapla.api.protobuf.DeleteTeamResponse - (*GetTeamResponse)(nil), // 3: dapla.api.protobuf.GetTeamResponse - (*GetTeamRequest)(nil), // 4: dapla.api.protobuf.GetTeamRequest - (*ListTeamsRequest)(nil), // 5: dapla.api.protobuf.ListTeamsRequest - (*ListTeamsResponse)(nil), // 6: dapla.api.protobuf.ListTeamsResponse - (*ListTeamGroupsRequest)(nil), // 7: dapla.api.protobuf.ListTeamGroupsRequest - (*ListTeamGroupsResponse)(nil), // 8: dapla.api.protobuf.ListTeamGroupsResponse - (*TeamGroup)(nil), // 9: dapla.api.protobuf.TeamGroup - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*PageInfo)(nil), // 11: dapla.api.protobuf.PageInfo - (*Group)(nil), // 12: dapla.api.protobuf.Group + (*Feature)(nil), // 1: dapla.api.protobuf.Feature + (*DeleteTeamRequest)(nil), // 2: dapla.api.protobuf.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 3: dapla.api.protobuf.DeleteTeamResponse + (*GetTeamResponse)(nil), // 4: dapla.api.protobuf.GetTeamResponse + (*GetTeamRequest)(nil), // 5: dapla.api.protobuf.GetTeamRequest + (*ListTeamsRequest)(nil), // 6: dapla.api.protobuf.ListTeamsRequest + (*ListTeamsResponse)(nil), // 7: dapla.api.protobuf.ListTeamsResponse + (*ListTeamGroupsRequest)(nil), // 8: dapla.api.protobuf.ListTeamGroupsRequest + (*ListTeamGroupsResponse)(nil), // 9: dapla.api.protobuf.ListTeamGroupsResponse + (*GetFeaturesRequest)(nil), // 10: dapla.api.protobuf.GetFeaturesRequest + (*GetFeaturesResponse)(nil), // 11: dapla.api.protobuf.GetFeaturesResponse + (*TeamGroup)(nil), // 12: dapla.api.protobuf.TeamGroup + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp + (*PageInfo)(nil), // 14: dapla.api.protobuf.PageInfo + (*Group)(nil), // 15: dapla.api.protobuf.Group } var file_teams_proto_depIdxs = []int32{ - 10, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp + 13, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp 0, // 1: dapla.api.protobuf.GetTeamResponse.team:type_name -> dapla.api.protobuf.Team 0, // 2: dapla.api.protobuf.ListTeamsResponse.nodes:type_name -> dapla.api.protobuf.Team - 11, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 9, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup - 11, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 12, // 6: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group - 4, // 7: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest - 5, // 8: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest - 7, // 9: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest - 1, // 10: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest - 3, // 11: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse - 6, // 12: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse - 8, // 13: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse - 2, // 14: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse - 11, // [11:15] is the sub-list for method output_type - 7, // [7:11] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 14, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 12, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup + 14, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 1, // 6: dapla.api.protobuf.GetFeaturesResponse.features:type_name -> dapla.api.protobuf.Feature + 15, // 7: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group + 5, // 8: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest + 6, // 9: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest + 8, // 10: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest + 2, // 11: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest + 10, // 12: dapla.api.protobuf.Teams.GetFeatures:input_type -> dapla.api.protobuf.GetFeaturesRequest + 4, // 13: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse + 7, // 14: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse + 9, // 15: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse + 3, // 16: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse + 11, // 17: dapla.api.protobuf.Teams.GetFeatures:output_type -> dapla.api.protobuf.GetFeaturesResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_teams_proto_init() } @@ -874,7 +1082,7 @@ func file_teams_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teams_proto_rawDesc), len(file_teams_proto_rawDesc)), NumEnums: 0, - NumMessages: 10, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/api/pkg/apiclient/protoapi/teams_grpc.pb.go b/api/pkg/apiclient/protoapi/teams_grpc.pb.go index 3db3afc..1517c4b 100644 --- a/api/pkg/apiclient/protoapi/teams_grpc.pb.go +++ b/api/pkg/apiclient/protoapi/teams_grpc.pb.go @@ -19,10 +19,11 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Teams_Get_FullMethodName = "/dapla.api.protobuf.Teams/Get" - Teams_List_FullMethodName = "/dapla.api.protobuf.Teams/List" - Teams_Groups_FullMethodName = "/dapla.api.protobuf.Teams/Groups" - Teams_Delete_FullMethodName = "/dapla.api.protobuf.Teams/Delete" + Teams_Get_FullMethodName = "/dapla.api.protobuf.Teams/Get" + Teams_List_FullMethodName = "/dapla.api.protobuf.Teams/List" + Teams_Groups_FullMethodName = "/dapla.api.protobuf.Teams/Groups" + Teams_Delete_FullMethodName = "/dapla.api.protobuf.Teams/Delete" + Teams_GetFeatures_FullMethodName = "/dapla.api.protobuf.Teams/GetFeatures" ) // TeamsClient is the client API for Teams service. @@ -33,6 +34,7 @@ type TeamsClient interface { List(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) Groups(ctx context.Context, in *ListTeamGroupsRequest, opts ...grpc.CallOption) (*ListTeamGroupsResponse, error) Delete(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) + GetFeatures(ctx context.Context, in *GetFeaturesRequest, opts ...grpc.CallOption) (*GetFeaturesResponse, error) } type teamsClient struct { @@ -83,6 +85,16 @@ func (c *teamsClient) Delete(ctx context.Context, in *DeleteTeamRequest, opts .. return out, nil } +func (c *teamsClient) GetFeatures(ctx context.Context, in *GetFeaturesRequest, opts ...grpc.CallOption) (*GetFeaturesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeaturesResponse) + err := c.cc.Invoke(ctx, Teams_GetFeatures_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // TeamsServer is the server API for Teams service. // All implementations must embed UnimplementedTeamsServer // for forward compatibility. @@ -91,6 +103,7 @@ type TeamsServer interface { List(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) Groups(context.Context, *ListTeamGroupsRequest) (*ListTeamGroupsResponse, error) Delete(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) + GetFeatures(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error) mustEmbedUnimplementedTeamsServer() } @@ -113,6 +126,9 @@ func (UnimplementedTeamsServer) Groups(context.Context, *ListTeamGroupsRequest) func (UnimplementedTeamsServer) Delete(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") } +func (UnimplementedTeamsServer) GetFeatures(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeatures not implemented") +} func (UnimplementedTeamsServer) mustEmbedUnimplementedTeamsServer() {} func (UnimplementedTeamsServer) testEmbeddedByValue() {} @@ -206,6 +222,24 @@ func _Teams_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _Teams_GetFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeaturesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamsServer).GetFeatures(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Teams_GetFeatures_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamsServer).GetFeatures(ctx, req.(*GetFeaturesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Teams_ServiceDesc is the grpc.ServiceDesc for Teams service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -229,6 +263,10 @@ var Teams_ServiceDesc = grpc.ServiceDesc{ MethodName: "Delete", Handler: _Teams_Delete_Handler, }, + { + MethodName: "GetFeatures", + Handler: _Teams_GetFeatures_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teams.proto", diff --git a/api/pkg/apiclient/protoapi/teams_protoopaque.pb.go b/api/pkg/apiclient/protoapi/teams_protoopaque.pb.go index 90f32a2..c6edc51 100644 --- a/api/pkg/apiclient/protoapi/teams_protoopaque.pb.go +++ b/api/pkg/apiclient/protoapi/teams_protoopaque.pb.go @@ -119,6 +119,77 @@ func (b0 Team_builder) Build() *Team { return m0 } +type Feature struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` + xxx_hidden_Env string `protobuf:"bytes,2,opt,name=env,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Feature) Reset() { + *x = Feature{} + mi := &file_teams_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Feature) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Feature) ProtoMessage() {} + +func (x *Feature) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Feature) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Feature) GetEnv() string { + if x != nil { + return x.xxx_hidden_Env + } + return "" +} + +func (x *Feature) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Feature) SetEnv(v string) { + x.xxx_hidden_Env = v +} + +type Feature_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Name string + Env string +} + +func (b0 Feature_builder) Build() *Feature { + m0 := &Feature{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Env = b.Env + return m0 +} + type DeleteTeamRequest struct { state protoimpl.MessageState `protogen:"opaque.v1"` xxx_hidden_Slug string `protobuf:"bytes,1,opt,name=slug,proto3"` @@ -128,7 +199,7 @@ type DeleteTeamRequest struct { func (x *DeleteTeamRequest) Reset() { *x = DeleteTeamRequest{} - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -140,7 +211,7 @@ func (x *DeleteTeamRequest) String() string { func (*DeleteTeamRequest) ProtoMessage() {} func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +255,7 @@ type DeleteTeamResponse struct { func (x *DeleteTeamResponse) Reset() { *x = DeleteTeamResponse{} - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -196,7 +267,7 @@ func (x *DeleteTeamResponse) String() string { func (*DeleteTeamResponse) ProtoMessage() {} func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -228,7 +299,7 @@ type GetTeamResponse struct { func (x *GetTeamResponse) Reset() { *x = GetTeamResponse{} - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -240,7 +311,7 @@ func (x *GetTeamResponse) String() string { func (*GetTeamResponse) ProtoMessage() {} func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -296,7 +367,7 @@ type GetTeamRequest struct { func (x *GetTeamRequest) Reset() { *x = GetTeamRequest{} - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +379,7 @@ func (x *GetTeamRequest) String() string { func (*GetTeamRequest) ProtoMessage() {} func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +425,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +437,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +496,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -437,7 +508,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -510,7 +581,7 @@ type ListTeamGroupsRequest struct { func (x *ListTeamGroupsRequest) Reset() { *x = ListTeamGroupsRequest{} - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -522,7 +593,7 @@ func (x *ListTeamGroupsRequest) String() string { func (*ListTeamGroupsRequest) ProtoMessage() {} func (x *ListTeamGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +665,7 @@ type ListTeamGroupsResponse struct { func (x *ListTeamGroupsResponse) Reset() { *x = ListTeamGroupsResponse{} - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -606,7 +677,7 @@ func (x *ListTeamGroupsResponse) String() string { func (*ListTeamGroupsResponse) ProtoMessage() {} func (x *ListTeamGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -668,6 +739,122 @@ func (b0 ListTeamGroupsResponse_builder) Build() *ListTeamGroupsResponse { return m0 } +type GetFeaturesRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Slug string `protobuf:"bytes,1,opt,name=slug,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesRequest) Reset() { + *x = GetFeaturesRequest{} + mi := &file_teams_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesRequest) ProtoMessage() {} + +func (x *GetFeaturesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesRequest) GetSlug() string { + if x != nil { + return x.xxx_hidden_Slug + } + return "" +} + +func (x *GetFeaturesRequest) SetSlug(v string) { + x.xxx_hidden_Slug = v +} + +type GetFeaturesRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Slug string +} + +func (b0 GetFeaturesRequest_builder) Build() *GetFeaturesRequest { + m0 := &GetFeaturesRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Slug = b.Slug + return m0 +} + +type GetFeaturesResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Features *[]*Feature `protobuf:"bytes,1,rep,name=features,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesResponse) Reset() { + *x = GetFeaturesResponse{} + mi := &file_teams_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesResponse) ProtoMessage() {} + +func (x *GetFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesResponse) GetFeatures() []*Feature { + if x != nil { + if x.xxx_hidden_Features != nil { + return *x.xxx_hidden_Features + } + } + return nil +} + +func (x *GetFeaturesResponse) SetFeatures(v []*Feature) { + x.xxx_hidden_Features = &v +} + +type GetFeaturesResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Features []*Feature +} + +func (b0 GetFeaturesResponse_builder) Build() *GetFeaturesResponse { + m0 := &GetFeaturesResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Features = &b.Features + return m0 +} + type TeamGroup struct { state protoimpl.MessageState `protogen:"opaque.v1"` xxx_hidden_Group *Group `protobuf:"bytes,1,opt,name=group,proto3"` @@ -677,7 +864,7 @@ type TeamGroup struct { func (x *TeamGroup) Reset() { *x = TeamGroup{} - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -689,7 +876,7 @@ func (x *TeamGroup) String() string { func (*TeamGroup) ProtoMessage() {} func (x *TeamGroup) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -756,112 +943,135 @@ var file_teams_proto_rawDesc = string([]byte{ 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x2f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, + 0x75, 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, + 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x40, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x32, 0xee, 0x02, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x67, 0x22, 0x4e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x70, + 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, + 0xd0, 0x03, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teams_proto_goTypes = []any{ (*Team)(nil), // 0: dapla.api.protobuf.Team - (*DeleteTeamRequest)(nil), // 1: dapla.api.protobuf.DeleteTeamRequest - (*DeleteTeamResponse)(nil), // 2: dapla.api.protobuf.DeleteTeamResponse - (*GetTeamResponse)(nil), // 3: dapla.api.protobuf.GetTeamResponse - (*GetTeamRequest)(nil), // 4: dapla.api.protobuf.GetTeamRequest - (*ListTeamsRequest)(nil), // 5: dapla.api.protobuf.ListTeamsRequest - (*ListTeamsResponse)(nil), // 6: dapla.api.protobuf.ListTeamsResponse - (*ListTeamGroupsRequest)(nil), // 7: dapla.api.protobuf.ListTeamGroupsRequest - (*ListTeamGroupsResponse)(nil), // 8: dapla.api.protobuf.ListTeamGroupsResponse - (*TeamGroup)(nil), // 9: dapla.api.protobuf.TeamGroup - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*PageInfo)(nil), // 11: dapla.api.protobuf.PageInfo - (*Group)(nil), // 12: dapla.api.protobuf.Group + (*Feature)(nil), // 1: dapla.api.protobuf.Feature + (*DeleteTeamRequest)(nil), // 2: dapla.api.protobuf.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 3: dapla.api.protobuf.DeleteTeamResponse + (*GetTeamResponse)(nil), // 4: dapla.api.protobuf.GetTeamResponse + (*GetTeamRequest)(nil), // 5: dapla.api.protobuf.GetTeamRequest + (*ListTeamsRequest)(nil), // 6: dapla.api.protobuf.ListTeamsRequest + (*ListTeamsResponse)(nil), // 7: dapla.api.protobuf.ListTeamsResponse + (*ListTeamGroupsRequest)(nil), // 8: dapla.api.protobuf.ListTeamGroupsRequest + (*ListTeamGroupsResponse)(nil), // 9: dapla.api.protobuf.ListTeamGroupsResponse + (*GetFeaturesRequest)(nil), // 10: dapla.api.protobuf.GetFeaturesRequest + (*GetFeaturesResponse)(nil), // 11: dapla.api.protobuf.GetFeaturesResponse + (*TeamGroup)(nil), // 12: dapla.api.protobuf.TeamGroup + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp + (*PageInfo)(nil), // 14: dapla.api.protobuf.PageInfo + (*Group)(nil), // 15: dapla.api.protobuf.Group } var file_teams_proto_depIdxs = []int32{ - 10, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp + 13, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp 0, // 1: dapla.api.protobuf.GetTeamResponse.team:type_name -> dapla.api.protobuf.Team 0, // 2: dapla.api.protobuf.ListTeamsResponse.nodes:type_name -> dapla.api.protobuf.Team - 11, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 9, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup - 11, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 12, // 6: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group - 4, // 7: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest - 5, // 8: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest - 7, // 9: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest - 1, // 10: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest - 3, // 11: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse - 6, // 12: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse - 8, // 13: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse - 2, // 14: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse - 11, // [11:15] is the sub-list for method output_type - 7, // [7:11] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 14, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 12, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup + 14, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 1, // 6: dapla.api.protobuf.GetFeaturesResponse.features:type_name -> dapla.api.protobuf.Feature + 15, // 7: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group + 5, // 8: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest + 6, // 9: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest + 8, // 10: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest + 2, // 11: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest + 10, // 12: dapla.api.protobuf.Teams.GetFeatures:input_type -> dapla.api.protobuf.GetFeaturesRequest + 4, // 13: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse + 7, // 14: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse + 9, // 15: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse + 3, // 16: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse + 11, // 17: dapla.api.protobuf.Teams.GetFeatures:output_type -> dapla.api.protobuf.GetFeaturesResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_teams_proto_init() } @@ -878,7 +1088,7 @@ func file_teams_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teams_proto_rawDesc), len(file_teams_proto_rawDesc)), NumEnums: 0, - NumMessages: 10, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/reconcilers/pkg/apiclient/protoapi/mock_teams_server.go b/reconcilers/pkg/apiclient/protoapi/mock_teams_server.go index 8b09447..313a2a3 100644 --- a/reconcilers/pkg/apiclient/protoapi/mock_teams_server.go +++ b/reconcilers/pkg/apiclient/protoapi/mock_teams_server.go @@ -174,6 +174,74 @@ func (_c *MockTeamsServer_Get_Call) RunAndReturn(run func(context1 context.Conte return _c } +// GetFeatures provides a mock function for the type MockTeamsServer +func (_mock *MockTeamsServer) GetFeatures(context1 context.Context, getFeaturesRequest *GetFeaturesRequest) (*GetFeaturesResponse, error) { + ret := _mock.Called(context1, getFeaturesRequest) + + if len(ret) == 0 { + panic("no return value specified for GetFeatures") + } + + var r0 *GetFeaturesResponse + var r1 error + if returnFunc, ok := ret.Get(0).(func(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error)); ok { + return returnFunc(context1, getFeaturesRequest) + } + if returnFunc, ok := ret.Get(0).(func(context.Context, *GetFeaturesRequest) *GetFeaturesResponse); ok { + r0 = returnFunc(context1, getFeaturesRequest) + } else { + if ret.Get(0) != nil { + r0 = ret.Get(0).(*GetFeaturesResponse) + } + } + if returnFunc, ok := ret.Get(1).(func(context.Context, *GetFeaturesRequest) error); ok { + r1 = returnFunc(context1, getFeaturesRequest) + } else { + r1 = ret.Error(1) + } + return r0, r1 +} + +// MockTeamsServer_GetFeatures_Call is a *mock.Call that shadows Run/Return methods with type explicit version for method 'GetFeatures' +type MockTeamsServer_GetFeatures_Call struct { + *mock.Call +} + +// GetFeatures is a helper method to define mock.On call +// - context1 context.Context +// - getFeaturesRequest *GetFeaturesRequest +func (_e *MockTeamsServer_Expecter) GetFeatures(context1 interface{}, getFeaturesRequest interface{}) *MockTeamsServer_GetFeatures_Call { + return &MockTeamsServer_GetFeatures_Call{Call: _e.mock.On("GetFeatures", context1, getFeaturesRequest)} +} + +func (_c *MockTeamsServer_GetFeatures_Call) Run(run func(context1 context.Context, getFeaturesRequest *GetFeaturesRequest)) *MockTeamsServer_GetFeatures_Call { + _c.Call.Run(func(args mock.Arguments) { + var arg0 context.Context + if args[0] != nil { + arg0 = args[0].(context.Context) + } + var arg1 *GetFeaturesRequest + if args[1] != nil { + arg1 = args[1].(*GetFeaturesRequest) + } + run( + arg0, + arg1, + ) + }) + return _c +} + +func (_c *MockTeamsServer_GetFeatures_Call) Return(getFeaturesResponse *GetFeaturesResponse, err error) *MockTeamsServer_GetFeatures_Call { + _c.Call.Return(getFeaturesResponse, err) + return _c +} + +func (_c *MockTeamsServer_GetFeatures_Call) RunAndReturn(run func(context1 context.Context, getFeaturesRequest *GetFeaturesRequest) (*GetFeaturesResponse, error)) *MockTeamsServer_GetFeatures_Call { + _c.Call.Return(run) + return _c +} + // Groups provides a mock function for the type MockTeamsServer func (_mock *MockTeamsServer) Groups(context1 context.Context, listTeamGroupsRequest *ListTeamGroupsRequest) (*ListTeamGroupsResponse, error) { ret := _mock.Called(context1, listTeamGroupsRequest) diff --git a/reconcilers/pkg/apiclient/protoapi/schema/teams.proto b/reconcilers/pkg/apiclient/protoapi/schema/teams.proto index 4615013..ecdf6d0 100644 --- a/reconcilers/pkg/apiclient/protoapi/schema/teams.proto +++ b/reconcilers/pkg/apiclient/protoapi/schema/teams.proto @@ -14,11 +14,17 @@ message Team { optional google.protobuf.Timestamp delete_key_confirmed_at = 3; } +message Feature { + string name = 1; + string env = 2; +} + service Teams { rpc Get(GetTeamRequest) returns (GetTeamResponse) {} rpc List(ListTeamsRequest) returns (ListTeamsResponse) {} rpc Groups(ListTeamGroupsRequest) returns (ListTeamGroupsResponse) {} rpc Delete(DeleteTeamRequest) returns (DeleteTeamResponse) {} + rpc GetFeatures(GetFeaturesRequest) returns (GetFeaturesResponse) {} } message DeleteTeamRequest { @@ -56,6 +62,14 @@ message ListTeamGroupsResponse { PageInfo page_info = 2; } +message GetFeaturesRequest { + string slug = 1; +} + +message GetFeaturesResponse { + repeated Feature features = 1; +} + message TeamGroup { Group group = 1; } diff --git a/reconcilers/pkg/apiclient/protoapi/teams.pb.go b/reconcilers/pkg/apiclient/protoapi/teams.pb.go index 61fa07c..0cc92b3 100644 --- a/reconcilers/pkg/apiclient/protoapi/teams.pb.go +++ b/reconcilers/pkg/apiclient/protoapi/teams.pb.go @@ -119,6 +119,77 @@ func (b0 Team_builder) Build() *Team { return m0 } +type Feature struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + Env string `protobuf:"bytes,2,opt,name=env,proto3" json:"env,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Feature) Reset() { + *x = Feature{} + mi := &file_teams_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Feature) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Feature) ProtoMessage() {} + +func (x *Feature) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Feature) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Feature) GetEnv() string { + if x != nil { + return x.Env + } + return "" +} + +func (x *Feature) SetName(v string) { + x.Name = v +} + +func (x *Feature) SetEnv(v string) { + x.Env = v +} + +type Feature_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Name string + Env string +} + +func (b0 Feature_builder) Build() *Feature { + m0 := &Feature{} + b, x := &b0, m0 + _, _ = b, x + x.Name = b.Name + x.Env = b.Env + return m0 +} + type DeleteTeamRequest struct { state protoimpl.MessageState `protogen:"hybrid.v1"` Slug string `protobuf:"bytes,1,opt,name=slug,proto3" json:"slug,omitempty"` @@ -128,7 +199,7 @@ type DeleteTeamRequest struct { func (x *DeleteTeamRequest) Reset() { *x = DeleteTeamRequest{} - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -140,7 +211,7 @@ func (x *DeleteTeamRequest) String() string { func (*DeleteTeamRequest) ProtoMessage() {} func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +255,7 @@ type DeleteTeamResponse struct { func (x *DeleteTeamResponse) Reset() { *x = DeleteTeamResponse{} - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -196,7 +267,7 @@ func (x *DeleteTeamResponse) String() string { func (*DeleteTeamResponse) ProtoMessage() {} func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -228,7 +299,7 @@ type GetTeamResponse struct { func (x *GetTeamResponse) Reset() { *x = GetTeamResponse{} - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -240,7 +311,7 @@ func (x *GetTeamResponse) String() string { func (*GetTeamResponse) ProtoMessage() {} func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -296,7 +367,7 @@ type GetTeamRequest struct { func (x *GetTeamRequest) Reset() { *x = GetTeamRequest{} - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +379,7 @@ func (x *GetTeamRequest) String() string { func (*GetTeamRequest) ProtoMessage() {} func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +425,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +437,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +496,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -437,7 +508,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -508,7 +579,7 @@ type ListTeamGroupsRequest struct { func (x *ListTeamGroupsRequest) Reset() { *x = ListTeamGroupsRequest{} - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -520,7 +591,7 @@ func (x *ListTeamGroupsRequest) String() string { func (*ListTeamGroupsRequest) ProtoMessage() {} func (x *ListTeamGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -592,7 +663,7 @@ type ListTeamGroupsResponse struct { func (x *ListTeamGroupsResponse) Reset() { *x = ListTeamGroupsResponse{} - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -604,7 +675,7 @@ func (x *ListTeamGroupsResponse) String() string { func (*ListTeamGroupsResponse) ProtoMessage() {} func (x *ListTeamGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -664,6 +735,120 @@ func (b0 ListTeamGroupsResponse_builder) Build() *ListTeamGroupsResponse { return m0 } +type GetFeaturesRequest struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Slug string `protobuf:"bytes,1,opt,name=slug,proto3" json:"slug,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesRequest) Reset() { + *x = GetFeaturesRequest{} + mi := &file_teams_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesRequest) ProtoMessage() {} + +func (x *GetFeaturesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesRequest) GetSlug() string { + if x != nil { + return x.Slug + } + return "" +} + +func (x *GetFeaturesRequest) SetSlug(v string) { + x.Slug = v +} + +type GetFeaturesRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Slug string +} + +func (b0 GetFeaturesRequest_builder) Build() *GetFeaturesRequest { + m0 := &GetFeaturesRequest{} + b, x := &b0, m0 + _, _ = b, x + x.Slug = b.Slug + return m0 +} + +type GetFeaturesResponse struct { + state protoimpl.MessageState `protogen:"hybrid.v1"` + Features []*Feature `protobuf:"bytes,1,rep,name=features,proto3" json:"features,omitempty"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesResponse) Reset() { + *x = GetFeaturesResponse{} + mi := &file_teams_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesResponse) ProtoMessage() {} + +func (x *GetFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesResponse) GetFeatures() []*Feature { + if x != nil { + return x.Features + } + return nil +} + +func (x *GetFeaturesResponse) SetFeatures(v []*Feature) { + x.Features = v +} + +type GetFeaturesResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Features []*Feature +} + +func (b0 GetFeaturesResponse_builder) Build() *GetFeaturesResponse { + m0 := &GetFeaturesResponse{} + b, x := &b0, m0 + _, _ = b, x + x.Features = b.Features + return m0 +} + type TeamGroup struct { state protoimpl.MessageState `protogen:"hybrid.v1"` Group *Group `protobuf:"bytes,1,opt,name=group,proto3" json:"group,omitempty"` @@ -673,7 +858,7 @@ type TeamGroup struct { func (x *TeamGroup) Reset() { *x = TeamGroup{} - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -685,7 +870,7 @@ func (x *TeamGroup) String() string { func (*TeamGroup) ProtoMessage() {} func (x *TeamGroup) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -752,112 +937,135 @@ var file_teams_proto_rawDesc = string([]byte{ 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x2f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, + 0x75, 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, + 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x40, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x32, 0xee, 0x02, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x67, 0x22, 0x4e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x70, + 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, + 0xd0, 0x03, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teams_proto_goTypes = []any{ (*Team)(nil), // 0: dapla.api.protobuf.Team - (*DeleteTeamRequest)(nil), // 1: dapla.api.protobuf.DeleteTeamRequest - (*DeleteTeamResponse)(nil), // 2: dapla.api.protobuf.DeleteTeamResponse - (*GetTeamResponse)(nil), // 3: dapla.api.protobuf.GetTeamResponse - (*GetTeamRequest)(nil), // 4: dapla.api.protobuf.GetTeamRequest - (*ListTeamsRequest)(nil), // 5: dapla.api.protobuf.ListTeamsRequest - (*ListTeamsResponse)(nil), // 6: dapla.api.protobuf.ListTeamsResponse - (*ListTeamGroupsRequest)(nil), // 7: dapla.api.protobuf.ListTeamGroupsRequest - (*ListTeamGroupsResponse)(nil), // 8: dapla.api.protobuf.ListTeamGroupsResponse - (*TeamGroup)(nil), // 9: dapla.api.protobuf.TeamGroup - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*PageInfo)(nil), // 11: dapla.api.protobuf.PageInfo - (*Group)(nil), // 12: dapla.api.protobuf.Group + (*Feature)(nil), // 1: dapla.api.protobuf.Feature + (*DeleteTeamRequest)(nil), // 2: dapla.api.protobuf.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 3: dapla.api.protobuf.DeleteTeamResponse + (*GetTeamResponse)(nil), // 4: dapla.api.protobuf.GetTeamResponse + (*GetTeamRequest)(nil), // 5: dapla.api.protobuf.GetTeamRequest + (*ListTeamsRequest)(nil), // 6: dapla.api.protobuf.ListTeamsRequest + (*ListTeamsResponse)(nil), // 7: dapla.api.protobuf.ListTeamsResponse + (*ListTeamGroupsRequest)(nil), // 8: dapla.api.protobuf.ListTeamGroupsRequest + (*ListTeamGroupsResponse)(nil), // 9: dapla.api.protobuf.ListTeamGroupsResponse + (*GetFeaturesRequest)(nil), // 10: dapla.api.protobuf.GetFeaturesRequest + (*GetFeaturesResponse)(nil), // 11: dapla.api.protobuf.GetFeaturesResponse + (*TeamGroup)(nil), // 12: dapla.api.protobuf.TeamGroup + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp + (*PageInfo)(nil), // 14: dapla.api.protobuf.PageInfo + (*Group)(nil), // 15: dapla.api.protobuf.Group } var file_teams_proto_depIdxs = []int32{ - 10, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp + 13, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp 0, // 1: dapla.api.protobuf.GetTeamResponse.team:type_name -> dapla.api.protobuf.Team 0, // 2: dapla.api.protobuf.ListTeamsResponse.nodes:type_name -> dapla.api.protobuf.Team - 11, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 9, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup - 11, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 12, // 6: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group - 4, // 7: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest - 5, // 8: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest - 7, // 9: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest - 1, // 10: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest - 3, // 11: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse - 6, // 12: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse - 8, // 13: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse - 2, // 14: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse - 11, // [11:15] is the sub-list for method output_type - 7, // [7:11] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 14, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 12, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup + 14, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 1, // 6: dapla.api.protobuf.GetFeaturesResponse.features:type_name -> dapla.api.protobuf.Feature + 15, // 7: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group + 5, // 8: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest + 6, // 9: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest + 8, // 10: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest + 2, // 11: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest + 10, // 12: dapla.api.protobuf.Teams.GetFeatures:input_type -> dapla.api.protobuf.GetFeaturesRequest + 4, // 13: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse + 7, // 14: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse + 9, // 15: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse + 3, // 16: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse + 11, // 17: dapla.api.protobuf.Teams.GetFeatures:output_type -> dapla.api.protobuf.GetFeaturesResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_teams_proto_init() } @@ -874,7 +1082,7 @@ func file_teams_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teams_proto_rawDesc), len(file_teams_proto_rawDesc)), NumEnums: 0, - NumMessages: 10, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, diff --git a/reconcilers/pkg/apiclient/protoapi/teams_grpc.pb.go b/reconcilers/pkg/apiclient/protoapi/teams_grpc.pb.go index 3db3afc..1517c4b 100644 --- a/reconcilers/pkg/apiclient/protoapi/teams_grpc.pb.go +++ b/reconcilers/pkg/apiclient/protoapi/teams_grpc.pb.go @@ -19,10 +19,11 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - Teams_Get_FullMethodName = "/dapla.api.protobuf.Teams/Get" - Teams_List_FullMethodName = "/dapla.api.protobuf.Teams/List" - Teams_Groups_FullMethodName = "/dapla.api.protobuf.Teams/Groups" - Teams_Delete_FullMethodName = "/dapla.api.protobuf.Teams/Delete" + Teams_Get_FullMethodName = "/dapla.api.protobuf.Teams/Get" + Teams_List_FullMethodName = "/dapla.api.protobuf.Teams/List" + Teams_Groups_FullMethodName = "/dapla.api.protobuf.Teams/Groups" + Teams_Delete_FullMethodName = "/dapla.api.protobuf.Teams/Delete" + Teams_GetFeatures_FullMethodName = "/dapla.api.protobuf.Teams/GetFeatures" ) // TeamsClient is the client API for Teams service. @@ -33,6 +34,7 @@ type TeamsClient interface { List(ctx context.Context, in *ListTeamsRequest, opts ...grpc.CallOption) (*ListTeamsResponse, error) Groups(ctx context.Context, in *ListTeamGroupsRequest, opts ...grpc.CallOption) (*ListTeamGroupsResponse, error) Delete(ctx context.Context, in *DeleteTeamRequest, opts ...grpc.CallOption) (*DeleteTeamResponse, error) + GetFeatures(ctx context.Context, in *GetFeaturesRequest, opts ...grpc.CallOption) (*GetFeaturesResponse, error) } type teamsClient struct { @@ -83,6 +85,16 @@ func (c *teamsClient) Delete(ctx context.Context, in *DeleteTeamRequest, opts .. return out, nil } +func (c *teamsClient) GetFeatures(ctx context.Context, in *GetFeaturesRequest, opts ...grpc.CallOption) (*GetFeaturesResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(GetFeaturesResponse) + err := c.cc.Invoke(ctx, Teams_GetFeatures_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // TeamsServer is the server API for Teams service. // All implementations must embed UnimplementedTeamsServer // for forward compatibility. @@ -91,6 +103,7 @@ type TeamsServer interface { List(context.Context, *ListTeamsRequest) (*ListTeamsResponse, error) Groups(context.Context, *ListTeamGroupsRequest) (*ListTeamGroupsResponse, error) Delete(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) + GetFeatures(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error) mustEmbedUnimplementedTeamsServer() } @@ -113,6 +126,9 @@ func (UnimplementedTeamsServer) Groups(context.Context, *ListTeamGroupsRequest) func (UnimplementedTeamsServer) Delete(context.Context, *DeleteTeamRequest) (*DeleteTeamResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method Delete not implemented") } +func (UnimplementedTeamsServer) GetFeatures(context.Context, *GetFeaturesRequest) (*GetFeaturesResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetFeatures not implemented") +} func (UnimplementedTeamsServer) mustEmbedUnimplementedTeamsServer() {} func (UnimplementedTeamsServer) testEmbeddedByValue() {} @@ -206,6 +222,24 @@ func _Teams_Delete_Handler(srv interface{}, ctx context.Context, dec func(interf return interceptor(ctx, in, info, handler) } +func _Teams_GetFeatures_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetFeaturesRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TeamsServer).GetFeatures(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Teams_GetFeatures_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TeamsServer).GetFeatures(ctx, req.(*GetFeaturesRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Teams_ServiceDesc is the grpc.ServiceDesc for Teams service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -229,6 +263,10 @@ var Teams_ServiceDesc = grpc.ServiceDesc{ MethodName: "Delete", Handler: _Teams_Delete_Handler, }, + { + MethodName: "GetFeatures", + Handler: _Teams_GetFeatures_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teams.proto", diff --git a/reconcilers/pkg/apiclient/protoapi/teams_protoopaque.pb.go b/reconcilers/pkg/apiclient/protoapi/teams_protoopaque.pb.go index 90f32a2..c6edc51 100644 --- a/reconcilers/pkg/apiclient/protoapi/teams_protoopaque.pb.go +++ b/reconcilers/pkg/apiclient/protoapi/teams_protoopaque.pb.go @@ -119,6 +119,77 @@ func (b0 Team_builder) Build() *Team { return m0 } +type Feature struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Name string `protobuf:"bytes,1,opt,name=name,proto3"` + xxx_hidden_Env string `protobuf:"bytes,2,opt,name=env,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *Feature) Reset() { + *x = Feature{} + mi := &file_teams_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *Feature) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Feature) ProtoMessage() {} + +func (x *Feature) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[1] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *Feature) GetName() string { + if x != nil { + return x.xxx_hidden_Name + } + return "" +} + +func (x *Feature) GetEnv() string { + if x != nil { + return x.xxx_hidden_Env + } + return "" +} + +func (x *Feature) SetName(v string) { + x.xxx_hidden_Name = v +} + +func (x *Feature) SetEnv(v string) { + x.xxx_hidden_Env = v +} + +type Feature_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Name string + Env string +} + +func (b0 Feature_builder) Build() *Feature { + m0 := &Feature{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Name = b.Name + x.xxx_hidden_Env = b.Env + return m0 +} + type DeleteTeamRequest struct { state protoimpl.MessageState `protogen:"opaque.v1"` xxx_hidden_Slug string `protobuf:"bytes,1,opt,name=slug,proto3"` @@ -128,7 +199,7 @@ type DeleteTeamRequest struct { func (x *DeleteTeamRequest) Reset() { *x = DeleteTeamRequest{} - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -140,7 +211,7 @@ func (x *DeleteTeamRequest) String() string { func (*DeleteTeamRequest) ProtoMessage() {} func (x *DeleteTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[1] + mi := &file_teams_proto_msgTypes[2] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -184,7 +255,7 @@ type DeleteTeamResponse struct { func (x *DeleteTeamResponse) Reset() { *x = DeleteTeamResponse{} - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -196,7 +267,7 @@ func (x *DeleteTeamResponse) String() string { func (*DeleteTeamResponse) ProtoMessage() {} func (x *DeleteTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[2] + mi := &file_teams_proto_msgTypes[3] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -228,7 +299,7 @@ type GetTeamResponse struct { func (x *GetTeamResponse) Reset() { *x = GetTeamResponse{} - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -240,7 +311,7 @@ func (x *GetTeamResponse) String() string { func (*GetTeamResponse) ProtoMessage() {} func (x *GetTeamResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[3] + mi := &file_teams_proto_msgTypes[4] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -296,7 +367,7 @@ type GetTeamRequest struct { func (x *GetTeamRequest) Reset() { *x = GetTeamRequest{} - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -308,7 +379,7 @@ func (x *GetTeamRequest) String() string { func (*GetTeamRequest) ProtoMessage() {} func (x *GetTeamRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[4] + mi := &file_teams_proto_msgTypes[5] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -354,7 +425,7 @@ type ListTeamsRequest struct { func (x *ListTeamsRequest) Reset() { *x = ListTeamsRequest{} - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -366,7 +437,7 @@ func (x *ListTeamsRequest) String() string { func (*ListTeamsRequest) ProtoMessage() {} func (x *ListTeamsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[5] + mi := &file_teams_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -425,7 +496,7 @@ type ListTeamsResponse struct { func (x *ListTeamsResponse) Reset() { *x = ListTeamsResponse{} - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -437,7 +508,7 @@ func (x *ListTeamsResponse) String() string { func (*ListTeamsResponse) ProtoMessage() {} func (x *ListTeamsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[6] + mi := &file_teams_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -510,7 +581,7 @@ type ListTeamGroupsRequest struct { func (x *ListTeamGroupsRequest) Reset() { *x = ListTeamGroupsRequest{} - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -522,7 +593,7 @@ func (x *ListTeamGroupsRequest) String() string { func (*ListTeamGroupsRequest) ProtoMessage() {} func (x *ListTeamGroupsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[7] + mi := &file_teams_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -594,7 +665,7 @@ type ListTeamGroupsResponse struct { func (x *ListTeamGroupsResponse) Reset() { *x = ListTeamGroupsResponse{} - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -606,7 +677,7 @@ func (x *ListTeamGroupsResponse) String() string { func (*ListTeamGroupsResponse) ProtoMessage() {} func (x *ListTeamGroupsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[8] + mi := &file_teams_proto_msgTypes[9] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -668,6 +739,122 @@ func (b0 ListTeamGroupsResponse_builder) Build() *ListTeamGroupsResponse { return m0 } +type GetFeaturesRequest struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Slug string `protobuf:"bytes,1,opt,name=slug,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesRequest) Reset() { + *x = GetFeaturesRequest{} + mi := &file_teams_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesRequest) ProtoMessage() {} + +func (x *GetFeaturesRequest) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesRequest) GetSlug() string { + if x != nil { + return x.xxx_hidden_Slug + } + return "" +} + +func (x *GetFeaturesRequest) SetSlug(v string) { + x.xxx_hidden_Slug = v +} + +type GetFeaturesRequest_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Slug string +} + +func (b0 GetFeaturesRequest_builder) Build() *GetFeaturesRequest { + m0 := &GetFeaturesRequest{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Slug = b.Slug + return m0 +} + +type GetFeaturesResponse struct { + state protoimpl.MessageState `protogen:"opaque.v1"` + xxx_hidden_Features *[]*Feature `protobuf:"bytes,1,rep,name=features,proto3"` + unknownFields protoimpl.UnknownFields + sizeCache protoimpl.SizeCache +} + +func (x *GetFeaturesResponse) Reset() { + *x = GetFeaturesResponse{} + mi := &file_teams_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetFeaturesResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetFeaturesResponse) ProtoMessage() {} + +func (x *GetFeaturesResponse) ProtoReflect() protoreflect.Message { + mi := &file_teams_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +func (x *GetFeaturesResponse) GetFeatures() []*Feature { + if x != nil { + if x.xxx_hidden_Features != nil { + return *x.xxx_hidden_Features + } + } + return nil +} + +func (x *GetFeaturesResponse) SetFeatures(v []*Feature) { + x.xxx_hidden_Features = &v +} + +type GetFeaturesResponse_builder struct { + _ [0]func() // Prevents comparability and use of unkeyed literals for the builder. + + Features []*Feature +} + +func (b0 GetFeaturesResponse_builder) Build() *GetFeaturesResponse { + m0 := &GetFeaturesResponse{} + b, x := &b0, m0 + _, _ = b, x + x.xxx_hidden_Features = &b.Features + return m0 +} + type TeamGroup struct { state protoimpl.MessageState `protogen:"opaque.v1"` xxx_hidden_Group *Group `protobuf:"bytes,1,opt,name=group,proto3"` @@ -677,7 +864,7 @@ type TeamGroup struct { func (x *TeamGroup) Reset() { *x = TeamGroup{} - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -689,7 +876,7 @@ func (x *TeamGroup) String() string { func (*TeamGroup) ProtoMessage() {} func (x *TeamGroup) ProtoReflect() protoreflect.Message { - mi := &file_teams_proto_msgTypes[9] + mi := &file_teams_proto_msgTypes[12] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -756,112 +943,135 @@ var file_teams_proto_rawDesc = string([]byte{ 0x70, 0x48, 0x00, 0x52, 0x14, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4b, 0x65, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, 0x64, 0x41, 0x74, 0x88, 0x01, 0x01, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, + 0x69, 0x72, 0x6d, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x2f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x65, 0x6e, 0x76, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x65, 0x6e, 0x76, 0x22, 0x27, 0x0a, 0x11, 0x44, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, + 0x75, 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, + 0x65, 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x65, 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, + 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, + 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, + 0x40, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, + 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, + 0x74, 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, + 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, + 0x6f, 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, + 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, + 0x16, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, + 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, + 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x28, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x46, 0x65, + 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, - 0x67, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x04, 0x74, 0x65, - 0x61, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x04, 0x74, 0x65, 0x61, 0x6d, 0x22, 0x24, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x54, - 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, - 0x75, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x40, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, - 0x22, 0x7e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, - 0x22, 0x59, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, - 0x69, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x88, 0x01, 0x0a, 0x16, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x33, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x39, 0x0a, 0x09, 0x70, - 0x61, 0x67, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x70, 0x61, - 0x67, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x12, 0x2f, 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x32, 0xee, 0x02, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, - 0x0a, 0x03, 0x47, 0x65, 0x74, 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, - 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, - 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, - 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, - 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x55, 0x0a, 0x04, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, - 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, - 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, + 0x67, 0x22, 0x4e, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x08, 0x66, 0x65, 0x61, 0x74, + 0x75, 0x72, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x64, 0x61, 0x70, + 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x08, 0x66, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, + 0x73, 0x22, 0x3c, 0x0a, 0x09, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x2f, + 0x0a, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x05, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x32, + 0xd0, 0x03, 0x0a, 0x05, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x12, 0x50, 0x0a, 0x03, 0x47, 0x65, 0x74, + 0x12, 0x22, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x55, 0x0a, 0x04, 0x4c, + 0x69, 0x73, 0x74, 0x12, 0x24, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, + 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x12, 0x61, 0x0a, 0x06, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x29, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x12, 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, - 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, - 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, - 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, - 0x70, 0x69, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, - 0x69, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x54, 0x65, 0x61, 0x6d, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x59, 0x0a, 0x06, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x12, + 0x25, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, + 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x54, 0x65, 0x61, 0x6d, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, + 0x12, 0x60, 0x0a, 0x0b, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x12, + 0x26, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x64, 0x61, 0x70, 0x6c, 0x61, 0x2e, + 0x61, 0x70, 0x69, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x47, 0x65, 0x74, + 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x00, 0x42, 0x1a, 0x5a, 0x18, 0x2e, 0x2f, 0x70, 0x6b, 0x67, 0x2f, 0x61, 0x70, 0x69, 0x63, + 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x61, 0x70, 0x69, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, }) -var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teams_proto_msgTypes = make([]protoimpl.MessageInfo, 13) var file_teams_proto_goTypes = []any{ (*Team)(nil), // 0: dapla.api.protobuf.Team - (*DeleteTeamRequest)(nil), // 1: dapla.api.protobuf.DeleteTeamRequest - (*DeleteTeamResponse)(nil), // 2: dapla.api.protobuf.DeleteTeamResponse - (*GetTeamResponse)(nil), // 3: dapla.api.protobuf.GetTeamResponse - (*GetTeamRequest)(nil), // 4: dapla.api.protobuf.GetTeamRequest - (*ListTeamsRequest)(nil), // 5: dapla.api.protobuf.ListTeamsRequest - (*ListTeamsResponse)(nil), // 6: dapla.api.protobuf.ListTeamsResponse - (*ListTeamGroupsRequest)(nil), // 7: dapla.api.protobuf.ListTeamGroupsRequest - (*ListTeamGroupsResponse)(nil), // 8: dapla.api.protobuf.ListTeamGroupsResponse - (*TeamGroup)(nil), // 9: dapla.api.protobuf.TeamGroup - (*timestamppb.Timestamp)(nil), // 10: google.protobuf.Timestamp - (*PageInfo)(nil), // 11: dapla.api.protobuf.PageInfo - (*Group)(nil), // 12: dapla.api.protobuf.Group + (*Feature)(nil), // 1: dapla.api.protobuf.Feature + (*DeleteTeamRequest)(nil), // 2: dapla.api.protobuf.DeleteTeamRequest + (*DeleteTeamResponse)(nil), // 3: dapla.api.protobuf.DeleteTeamResponse + (*GetTeamResponse)(nil), // 4: dapla.api.protobuf.GetTeamResponse + (*GetTeamRequest)(nil), // 5: dapla.api.protobuf.GetTeamRequest + (*ListTeamsRequest)(nil), // 6: dapla.api.protobuf.ListTeamsRequest + (*ListTeamsResponse)(nil), // 7: dapla.api.protobuf.ListTeamsResponse + (*ListTeamGroupsRequest)(nil), // 8: dapla.api.protobuf.ListTeamGroupsRequest + (*ListTeamGroupsResponse)(nil), // 9: dapla.api.protobuf.ListTeamGroupsResponse + (*GetFeaturesRequest)(nil), // 10: dapla.api.protobuf.GetFeaturesRequest + (*GetFeaturesResponse)(nil), // 11: dapla.api.protobuf.GetFeaturesResponse + (*TeamGroup)(nil), // 12: dapla.api.protobuf.TeamGroup + (*timestamppb.Timestamp)(nil), // 13: google.protobuf.Timestamp + (*PageInfo)(nil), // 14: dapla.api.protobuf.PageInfo + (*Group)(nil), // 15: dapla.api.protobuf.Group } var file_teams_proto_depIdxs = []int32{ - 10, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp + 13, // 0: dapla.api.protobuf.Team.delete_key_confirmed_at:type_name -> google.protobuf.Timestamp 0, // 1: dapla.api.protobuf.GetTeamResponse.team:type_name -> dapla.api.protobuf.Team 0, // 2: dapla.api.protobuf.ListTeamsResponse.nodes:type_name -> dapla.api.protobuf.Team - 11, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 9, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup - 11, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo - 12, // 6: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group - 4, // 7: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest - 5, // 8: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest - 7, // 9: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest - 1, // 10: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest - 3, // 11: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse - 6, // 12: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse - 8, // 13: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse - 2, // 14: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse - 11, // [11:15] is the sub-list for method output_type - 7, // [7:11] is the sub-list for method input_type - 7, // [7:7] is the sub-list for extension type_name - 7, // [7:7] is the sub-list for extension extendee - 0, // [0:7] is the sub-list for field type_name + 14, // 3: dapla.api.protobuf.ListTeamsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 12, // 4: dapla.api.protobuf.ListTeamGroupsResponse.nodes:type_name -> dapla.api.protobuf.TeamGroup + 14, // 5: dapla.api.protobuf.ListTeamGroupsResponse.page_info:type_name -> dapla.api.protobuf.PageInfo + 1, // 6: dapla.api.protobuf.GetFeaturesResponse.features:type_name -> dapla.api.protobuf.Feature + 15, // 7: dapla.api.protobuf.TeamGroup.group:type_name -> dapla.api.protobuf.Group + 5, // 8: dapla.api.protobuf.Teams.Get:input_type -> dapla.api.protobuf.GetTeamRequest + 6, // 9: dapla.api.protobuf.Teams.List:input_type -> dapla.api.protobuf.ListTeamsRequest + 8, // 10: dapla.api.protobuf.Teams.Groups:input_type -> dapla.api.protobuf.ListTeamGroupsRequest + 2, // 11: dapla.api.protobuf.Teams.Delete:input_type -> dapla.api.protobuf.DeleteTeamRequest + 10, // 12: dapla.api.protobuf.Teams.GetFeatures:input_type -> dapla.api.protobuf.GetFeaturesRequest + 4, // 13: dapla.api.protobuf.Teams.Get:output_type -> dapla.api.protobuf.GetTeamResponse + 7, // 14: dapla.api.protobuf.Teams.List:output_type -> dapla.api.protobuf.ListTeamsResponse + 9, // 15: dapla.api.protobuf.Teams.Groups:output_type -> dapla.api.protobuf.ListTeamGroupsResponse + 3, // 16: dapla.api.protobuf.Teams.Delete:output_type -> dapla.api.protobuf.DeleteTeamResponse + 11, // 17: dapla.api.protobuf.Teams.GetFeatures:output_type -> dapla.api.protobuf.GetFeaturesResponse + 13, // [13:18] is the sub-list for method output_type + 8, // [8:13] is the sub-list for method input_type + 8, // [8:8] is the sub-list for extension type_name + 8, // [8:8] is the sub-list for extension extendee + 0, // [0:8] is the sub-list for field type_name } func init() { file_teams_proto_init() } @@ -878,7 +1088,7 @@ func file_teams_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: unsafe.Slice(unsafe.StringData(file_teams_proto_rawDesc), len(file_teams_proto_rawDesc)), NumEnums: 0, - NumMessages: 10, + NumMessages: 13, NumExtensions: 0, NumServices: 1, }, From 552342e0c90278b25c50fa6f98add7b7f150f836 Mon Sep 17 00:00:00 2001 From: nicolst <35232838+nicolst@users.noreply.github.com> Date: Wed, 8 Jul 2026 14:26:20 +0200 Subject: [PATCH 3/9] implement reconciler --- reconcilers/internal/reconcilers/dummy/reconciler.go | 9 ++++++--- reconcilers/teams/a200-stoetteteam | 1 - reconcilers/teams/a300-gis-pii | 1 - reconcilers/teams/aordning-register | 1 - reconcilers/teams/arbmark-aku | 1 - reconcilers/teams/arbmark-register | 1 - reconcilers/teams/arbmark-skjema | 1 - reconcilers/teams/arbulykker | 1 - reconcilers/teams/areal | 1 - reconcilers/teams/arkitektur | 1 - reconcilers/teams/barnevern | 1 - reconcilers/teams/barneverng | 1 - reconcilers/teams/barneverni | 1 - reconcilers/teams/bef-analyse | 1 - reconcilers/teams/bef-bosted | 1 - reconcilers/teams/bef-husholdning | 1 - reconcilers/teams/bef-oppdrag | 1 - reconcilers/teams/bef-regional | 1 - reconcilers/teams/bef-statistikk | 1 - reconcilers/teams/bef-valg | 1 - reconcilers/teams/befstat | 1 - reconcilers/teams/betfor | 1 - reconcilers/teams/bilpark-nybil | 1 - reconcilers/teams/bki | 1 - reconcilers/teams/bof-stedfesting | 1 - reconcilers/teams/boforholdregister | 1 - reconcilers/teams/bpi | 1 - reconcilers/teams/brann-kostra | 1 - reconcilers/teams/bygg | 1 - reconcilers/teams/dapla-felles | 1 - reconcilers/teams/dapla-ffunk | 1 - reconcilers/teams/dapla-lab | 1 - reconcilers/teams/dapla-metadata | 1 - reconcilers/teams/dapla-onprem-vpn | 1 - reconcilers/teams/dapla-platform | 1 - reconcilers/teams/dapla-pseudo | 1 - reconcilers/teams/dapla-skyinfra | 1 - reconcilers/teams/dapla-stat | 1 - reconcilers/teams/datafangst-alf | 1 - reconcilers/teams/datafangst-altinn | 1 - reconcilers/teams/datafangst-blaise | 1 - reconcilers/teams/datafangst-innfin | 1 - reconcilers/teams/datafangst-kart | 1 - reconcilers/teams/datafangst-m2m | 1 - reconcilers/teams/datafangst-person | 1 - reconcilers/teams/datafangst-planle | 1 - reconcilers/teams/dftjen | 1 - reconcilers/teams/el-pris-volum | 1 - reconcilers/teams/energ-ind-korttid | 1 - reconcilers/teams/energi-ereb | 1 - reconcilers/teams/energi-fjernvarme | 1 - reconcilers/teams/energi-industri | 1 - reconcilers/teams/energi-petrole | 1 - reconcilers/teams/energi-rapp | 1 - reconcilers/teams/etlev | 1 - reconcilers/teams/famvern | 1 - reconcilers/teams/fastlegetj | 1 - reconcilers/teams/finmark | 1 - reconcilers/teams/finpop | 1 - reconcilers/teams/finregn | 1 - reconcilers/teams/folksim | 1 - reconcilers/teams/forbruk-isolert | 1 - reconcilers/teams/forbruk-stat | 1 - reconcilers/teams/forbruk-transak | 1 - reconcilers/teams/fordelingsregnska | 1 - reconcilers/teams/forsk-mismatch | 1 - reconcilers/teams/forsk-nhm | 1 - reconcilers/teams/forskteknar-forsk | 1 - reconcilers/teams/forskteknar-narin | 1 - reconcilers/teams/forskteknar-tek | 1 - reconcilers/teams/funkhem | 1 - reconcilers/teams/hack-fnrleting | 1 - reconcilers/teams/helseforhold | 1 - reconcilers/teams/helsetjko | 1 - reconcilers/teams/infoforvaltning | 1 - reconcilers/teams/inntekt-hushold | 1 - reconcilers/teams/itinfra-bakkesyst | 1 - reconcilers/teams/itinfra-ks | 1 - reconcilers/teams/keycloak | 1 - reconcilers/teams/kombolig-kostra | 1 - reconcilers/teams/kosthald | 1 - reconcilers/teams/kostra | 1 - reconcilers/teams/krim-og-rett | 1 - reconcilers/teams/kultur-biblmuseum | 1 - reconcilers/teams/kultur-kultmed | 1 - reconcilers/teams/kultur-trokirke | 1 - reconcilers/teams/kurs-fra-kilde | 1 - reconcilers/teams/laerermod | 1 - reconcilers/teams/lb-sky | 1 - reconcilers/teams/levekaar | 1 - reconcilers/teams/levekaar-arbeid | 1 - reconcilers/teams/levekaar-barn | 1 - reconcilers/teams/livskvalitet | 1 - reconcilers/teams/lotte | 1 - reconcilers/teams/makro-demec | 1 - reconcilers/teams/metode-naceomlegg | 1 - reconcilers/teams/metode-sesong | 1 - reconcilers/teams/microdata | 1 - reconcilers/teams/microdata-no | 1 - reconcilers/teams/mikrodata-oppdrag | 1 - reconcilers/teams/naturregnskap | 1 - reconcilers/teams/nr | 1 - reconcilers/teams/nr-likningsmodul | 1 - reconcilers/teams/nspek | 1 - reconcilers/teams/off-fin | 1 - reconcilers/teams/opera-forretning | 1 - reconcilers/teams/papis | 1 - reconcilers/teams/pasient | 1 - reconcilers/teams/play-chatbot | 1 - reconcilers/teams/play-datafangst | 1 - reconcilers/teams/play-dba | 1 - reconcilers/teams/play-enhjoern-a | 1 - reconcilers/teams/play-ffunk-edit-a | 1 - reconcilers/teams/play-ffunk-edit-b | 1 - reconcilers/teams/play-foeniks-a | 1 - reconcilers/teams/play-lab | 1 - reconcilers/teams/play-mabl-test | 1 - reconcilers/teams/play-obr | 1 - reconcilers/teams/play-obr-b | 1 - reconcilers/teams/play-skatt | 1 - reconcilers/teams/play-skyinfra-a | 1 - reconcilers/teams/pleie | 1 - reconcilers/teams/poc-composer | 1 - reconcilers/teams/pop-lb-eiendom | 1 - reconcilers/teams/pop-mat-gb | 1 - reconcilers/teams/primaer-j-reg | 1 - reconcilers/teams/primaer-j-skjema | 1 - reconcilers/teams/primaer-jakt | 1 - reconcilers/teams/prisstat | 1 - reconcilers/teams/proj-aiml-edit | 1 - reconcilers/teams/pseudo-comp-test | 1 - reconcilers/teams/reg-a-ordningen | 1 - reconcilers/teams/reg-bof | 1 - reconcilers/teams/reg-freg | 1 - reconcilers/teams/reg-matrikkel | 1 - reconcilers/teams/reiseliv-korttid | 1 - reconcilers/teams/royk | 1 - reconcilers/teams/sikkerhetssenter | 1 - reconcilers/teams/sirius-editering | 1 - reconcilers/teams/skatt-naering | 1 - reconcilers/teams/skatt-person | 1 - reconcilers/teams/sosial-kvp | 1 - reconcilers/teams/sosialhjelpk | 1 - reconcilers/teams/speshelse | 1 - reconcilers/teams/ssbno | 1 - reconcilers/teams/stat-skog | 1 - reconcilers/teams/statbank | 1 - reconcilers/teams/strukt-arbkost | 1 - reconcilers/teams/strukt-kraftnarin | 1 - reconcilers/teams/strukt-miljoe | 1 - reconcilers/teams/strukt-mva | 1 - reconcilers/teams/strukt-naering | 1 - reconcilers/teams/sup | 1 - reconcilers/teams/suv-altinn | 1 - reconcilers/teams/tannhelse | 1 - reconcilers/teams/tech-coach | 1 - reconcilers/teams/tidsbruk-survey | 1 - reconcilers/teams/tip-tutorials | 1 - reconcilers/teams/transport-baat | 1 - reconcilers/teams/transport-bil | 1 - reconcilers/teams/transport-fly | 1 - reconcilers/teams/transport-kollekt | 1 - reconcilers/teams/transport-kostind | 1 - reconcilers/teams/transport-kostra | 1 - reconcilers/teams/transport-lastbil | 1 - reconcilers/teams/trygd-person | 1 - reconcilers/teams/uh-tjenester | 1 - reconcilers/teams/uh-varer | 1 - reconcilers/teams/utd-bhgskole | 1 - reconcilers/teams/utd-inter | 1 - reconcilers/teams/utd-kompetanse | 1 - reconcilers/teams/utd-nudb | 1 - reconcilers/teams/utd-tverr | 1 - reconcilers/teams/utd-uhfagskole | 1 - reconcilers/teams/utd-vg | 1 - reconcilers/teams/utslipp-luft | 1 - reconcilers/teams/var-avfall | 1 - reconcilers/teams/var-avlop | 1 - reconcilers/teams/var-materialstrom | 1 - reconcilers/teams/var-vann-kostra | 1 - reconcilers/teams/vare-tjen-korttid | 1 - reconcilers/teams/verdsetting-bolig | 1 - reconcilers/teams/vof | 1 - 183 files changed, 6 insertions(+), 185 deletions(-) delete mode 100644 reconcilers/teams/a200-stoetteteam delete mode 100644 reconcilers/teams/a300-gis-pii delete mode 100644 reconcilers/teams/aordning-register delete mode 100644 reconcilers/teams/arbmark-aku delete mode 100644 reconcilers/teams/arbmark-register delete mode 100644 reconcilers/teams/arbmark-skjema delete mode 100644 reconcilers/teams/arbulykker delete mode 100644 reconcilers/teams/areal delete mode 100644 reconcilers/teams/arkitektur delete mode 100644 reconcilers/teams/barnevern delete mode 100644 reconcilers/teams/barneverng delete mode 100644 reconcilers/teams/barneverni delete mode 100644 reconcilers/teams/bef-analyse delete mode 100644 reconcilers/teams/bef-bosted delete mode 100644 reconcilers/teams/bef-husholdning delete mode 100644 reconcilers/teams/bef-oppdrag delete mode 100644 reconcilers/teams/bef-regional delete mode 100644 reconcilers/teams/bef-statistikk delete mode 100644 reconcilers/teams/bef-valg delete mode 100644 reconcilers/teams/befstat delete mode 100644 reconcilers/teams/betfor delete mode 100644 reconcilers/teams/bilpark-nybil delete mode 100644 reconcilers/teams/bki delete mode 100644 reconcilers/teams/bof-stedfesting delete mode 100644 reconcilers/teams/boforholdregister delete mode 100644 reconcilers/teams/bpi delete mode 100644 reconcilers/teams/brann-kostra delete mode 100644 reconcilers/teams/bygg delete mode 100644 reconcilers/teams/dapla-felles delete mode 100644 reconcilers/teams/dapla-ffunk delete mode 100644 reconcilers/teams/dapla-lab delete mode 100644 reconcilers/teams/dapla-metadata delete mode 100644 reconcilers/teams/dapla-onprem-vpn delete mode 100644 reconcilers/teams/dapla-platform delete mode 100644 reconcilers/teams/dapla-pseudo delete mode 100644 reconcilers/teams/dapla-skyinfra delete mode 100644 reconcilers/teams/dapla-stat delete mode 100644 reconcilers/teams/datafangst-alf delete mode 100644 reconcilers/teams/datafangst-altinn delete mode 100644 reconcilers/teams/datafangst-blaise delete mode 100644 reconcilers/teams/datafangst-innfin delete mode 100644 reconcilers/teams/datafangst-kart delete mode 100644 reconcilers/teams/datafangst-m2m delete mode 100644 reconcilers/teams/datafangst-person delete mode 100644 reconcilers/teams/datafangst-planle delete mode 100644 reconcilers/teams/dftjen delete mode 100644 reconcilers/teams/el-pris-volum delete mode 100644 reconcilers/teams/energ-ind-korttid delete mode 100644 reconcilers/teams/energi-ereb delete mode 100644 reconcilers/teams/energi-fjernvarme delete mode 100644 reconcilers/teams/energi-industri delete mode 100644 reconcilers/teams/energi-petrole delete mode 100644 reconcilers/teams/energi-rapp delete mode 100644 reconcilers/teams/etlev delete mode 100644 reconcilers/teams/famvern delete mode 100644 reconcilers/teams/fastlegetj delete mode 100644 reconcilers/teams/finmark delete mode 100644 reconcilers/teams/finpop delete mode 100644 reconcilers/teams/finregn delete mode 100644 reconcilers/teams/folksim delete mode 100644 reconcilers/teams/forbruk-isolert delete mode 100644 reconcilers/teams/forbruk-stat delete mode 100644 reconcilers/teams/forbruk-transak delete mode 100644 reconcilers/teams/fordelingsregnska delete mode 100644 reconcilers/teams/forsk-mismatch delete mode 100644 reconcilers/teams/forsk-nhm delete mode 100644 reconcilers/teams/forskteknar-forsk delete mode 100644 reconcilers/teams/forskteknar-narin delete mode 100644 reconcilers/teams/forskteknar-tek delete mode 100644 reconcilers/teams/funkhem delete mode 100644 reconcilers/teams/hack-fnrleting delete mode 100644 reconcilers/teams/helseforhold delete mode 100644 reconcilers/teams/helsetjko delete mode 100644 reconcilers/teams/infoforvaltning delete mode 100644 reconcilers/teams/inntekt-hushold delete mode 100644 reconcilers/teams/itinfra-bakkesyst delete mode 100644 reconcilers/teams/itinfra-ks delete mode 100644 reconcilers/teams/keycloak delete mode 100644 reconcilers/teams/kombolig-kostra delete mode 100644 reconcilers/teams/kosthald delete mode 100644 reconcilers/teams/kostra delete mode 100644 reconcilers/teams/krim-og-rett delete mode 100644 reconcilers/teams/kultur-biblmuseum delete mode 100644 reconcilers/teams/kultur-kultmed delete mode 100644 reconcilers/teams/kultur-trokirke delete mode 100644 reconcilers/teams/kurs-fra-kilde delete mode 100644 reconcilers/teams/laerermod delete mode 100644 reconcilers/teams/lb-sky delete mode 100644 reconcilers/teams/levekaar delete mode 100644 reconcilers/teams/levekaar-arbeid delete mode 100644 reconcilers/teams/levekaar-barn delete mode 100644 reconcilers/teams/livskvalitet delete mode 100644 reconcilers/teams/lotte delete mode 100644 reconcilers/teams/makro-demec delete mode 100644 reconcilers/teams/metode-naceomlegg delete mode 100644 reconcilers/teams/metode-sesong delete mode 100644 reconcilers/teams/microdata delete mode 100644 reconcilers/teams/microdata-no delete mode 100644 reconcilers/teams/mikrodata-oppdrag delete mode 100644 reconcilers/teams/naturregnskap delete mode 100644 reconcilers/teams/nr delete mode 100644 reconcilers/teams/nr-likningsmodul delete mode 100644 reconcilers/teams/nspek delete mode 100644 reconcilers/teams/off-fin delete mode 100644 reconcilers/teams/opera-forretning delete mode 100644 reconcilers/teams/papis delete mode 100644 reconcilers/teams/pasient delete mode 100644 reconcilers/teams/play-chatbot delete mode 100644 reconcilers/teams/play-datafangst delete mode 100644 reconcilers/teams/play-dba delete mode 100644 reconcilers/teams/play-enhjoern-a delete mode 100644 reconcilers/teams/play-ffunk-edit-a delete mode 100644 reconcilers/teams/play-ffunk-edit-b delete mode 100644 reconcilers/teams/play-foeniks-a delete mode 100644 reconcilers/teams/play-lab delete mode 100644 reconcilers/teams/play-mabl-test delete mode 100644 reconcilers/teams/play-obr delete mode 100644 reconcilers/teams/play-obr-b delete mode 100644 reconcilers/teams/play-skatt delete mode 100644 reconcilers/teams/play-skyinfra-a delete mode 100644 reconcilers/teams/pleie delete mode 100644 reconcilers/teams/poc-composer delete mode 100644 reconcilers/teams/pop-lb-eiendom delete mode 100644 reconcilers/teams/pop-mat-gb delete mode 100644 reconcilers/teams/primaer-j-reg delete mode 100644 reconcilers/teams/primaer-j-skjema delete mode 100644 reconcilers/teams/primaer-jakt delete mode 100644 reconcilers/teams/prisstat delete mode 100644 reconcilers/teams/proj-aiml-edit delete mode 100644 reconcilers/teams/pseudo-comp-test delete mode 100644 reconcilers/teams/reg-a-ordningen delete mode 100644 reconcilers/teams/reg-bof delete mode 100644 reconcilers/teams/reg-freg delete mode 100644 reconcilers/teams/reg-matrikkel delete mode 100644 reconcilers/teams/reiseliv-korttid delete mode 100644 reconcilers/teams/royk delete mode 100644 reconcilers/teams/sikkerhetssenter delete mode 100644 reconcilers/teams/sirius-editering delete mode 100644 reconcilers/teams/skatt-naering delete mode 100644 reconcilers/teams/skatt-person delete mode 100644 reconcilers/teams/sosial-kvp delete mode 100644 reconcilers/teams/sosialhjelpk delete mode 100644 reconcilers/teams/speshelse delete mode 100644 reconcilers/teams/ssbno delete mode 100644 reconcilers/teams/stat-skog delete mode 100644 reconcilers/teams/statbank delete mode 100644 reconcilers/teams/strukt-arbkost delete mode 100644 reconcilers/teams/strukt-kraftnarin delete mode 100644 reconcilers/teams/strukt-miljoe delete mode 100644 reconcilers/teams/strukt-mva delete mode 100644 reconcilers/teams/strukt-naering delete mode 100644 reconcilers/teams/sup delete mode 100644 reconcilers/teams/suv-altinn delete mode 100644 reconcilers/teams/tannhelse delete mode 100644 reconcilers/teams/tech-coach delete mode 100644 reconcilers/teams/tidsbruk-survey delete mode 100644 reconcilers/teams/tip-tutorials delete mode 100644 reconcilers/teams/transport-baat delete mode 100644 reconcilers/teams/transport-bil delete mode 100644 reconcilers/teams/transport-fly delete mode 100644 reconcilers/teams/transport-kollekt delete mode 100644 reconcilers/teams/transport-kostind delete mode 100644 reconcilers/teams/transport-kostra delete mode 100644 reconcilers/teams/transport-lastbil delete mode 100644 reconcilers/teams/trygd-person delete mode 100644 reconcilers/teams/uh-tjenester delete mode 100644 reconcilers/teams/uh-varer delete mode 100644 reconcilers/teams/utd-bhgskole delete mode 100644 reconcilers/teams/utd-inter delete mode 100644 reconcilers/teams/utd-kompetanse delete mode 100644 reconcilers/teams/utd-nudb delete mode 100644 reconcilers/teams/utd-tverr delete mode 100644 reconcilers/teams/utd-uhfagskole delete mode 100644 reconcilers/teams/utd-vg delete mode 100644 reconcilers/teams/utslipp-luft delete mode 100644 reconcilers/teams/var-avfall delete mode 100644 reconcilers/teams/var-avlop delete mode 100644 reconcilers/teams/var-materialstrom delete mode 100644 reconcilers/teams/var-vann-kostra delete mode 100644 reconcilers/teams/vare-tjen-korttid delete mode 100644 reconcilers/teams/verdsetting-bolig delete mode 100644 reconcilers/teams/vof diff --git a/reconcilers/internal/reconcilers/dummy/reconciler.go b/reconcilers/internal/reconcilers/dummy/reconciler.go index 69582a9..7e5e16e 100644 --- a/reconcilers/internal/reconcilers/dummy/reconciler.go +++ b/reconcilers/internal/reconcilers/dummy/reconciler.go @@ -4,7 +4,6 @@ import ( "context" "fmt" "os" - "time" "github.com/sirupsen/logrus" "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient" @@ -42,11 +41,15 @@ func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, return fmt.Errorf("create team file: %w", err) } - formattedDate := time.Now().Format("15:04:05 02 01 2006") - if _, err := f.Write([]byte(formattedDate)); err != nil { + resp, err := client.Teams().GetFeatures(ctx, &protoapi.GetFeaturesRequest{Slug: daplaTeam.Slug}) + if err != nil { return err } + for _, feat := range resp.Features { + fmt.Fprintf(f, "%s\t%s\n", feat.Name, feat.Env) + } + return nil } diff --git a/reconcilers/teams/a200-stoetteteam b/reconcilers/teams/a200-stoetteteam deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/a200-stoetteteam +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/a300-gis-pii b/reconcilers/teams/a300-gis-pii deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/a300-gis-pii +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/aordning-register b/reconcilers/teams/aordning-register deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/aordning-register +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-aku b/reconcilers/teams/arbmark-aku deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/arbmark-aku +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-register b/reconcilers/teams/arbmark-register deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/arbmark-register +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbmark-skjema b/reconcilers/teams/arbmark-skjema deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/arbmark-skjema +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arbulykker b/reconcilers/teams/arbulykker deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/arbulykker +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/areal b/reconcilers/teams/areal deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/areal +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/arkitektur b/reconcilers/teams/arkitektur deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/arkitektur +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barnevern b/reconcilers/teams/barnevern deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/barnevern +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barneverng b/reconcilers/teams/barneverng deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/barneverng +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/barneverni b/reconcilers/teams/barneverni deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/barneverni +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-analyse b/reconcilers/teams/bef-analyse deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-analyse +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-bosted b/reconcilers/teams/bef-bosted deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-bosted +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-husholdning b/reconcilers/teams/bef-husholdning deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-husholdning +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-oppdrag b/reconcilers/teams/bef-oppdrag deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-oppdrag +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-regional b/reconcilers/teams/bef-regional deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-regional +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-statistikk b/reconcilers/teams/bef-statistikk deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-statistikk +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bef-valg b/reconcilers/teams/bef-valg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bef-valg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/befstat b/reconcilers/teams/befstat deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/befstat +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/betfor b/reconcilers/teams/betfor deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/betfor +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bilpark-nybil b/reconcilers/teams/bilpark-nybil deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bilpark-nybil +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bki b/reconcilers/teams/bki deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bki +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bof-stedfesting b/reconcilers/teams/bof-stedfesting deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bof-stedfesting +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/boforholdregister b/reconcilers/teams/boforholdregister deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/boforholdregister +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bpi b/reconcilers/teams/bpi deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bpi +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/brann-kostra b/reconcilers/teams/brann-kostra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/brann-kostra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/bygg b/reconcilers/teams/bygg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/bygg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-felles b/reconcilers/teams/dapla-felles deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-felles +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-ffunk b/reconcilers/teams/dapla-ffunk deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-ffunk +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-lab b/reconcilers/teams/dapla-lab deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-lab +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-metadata b/reconcilers/teams/dapla-metadata deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-metadata +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-onprem-vpn b/reconcilers/teams/dapla-onprem-vpn deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-onprem-vpn +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-platform b/reconcilers/teams/dapla-platform deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-platform +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-pseudo b/reconcilers/teams/dapla-pseudo deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-pseudo +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-skyinfra b/reconcilers/teams/dapla-skyinfra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-skyinfra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dapla-stat b/reconcilers/teams/dapla-stat deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dapla-stat +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-alf b/reconcilers/teams/datafangst-alf deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-alf +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-altinn b/reconcilers/teams/datafangst-altinn deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-altinn +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-blaise b/reconcilers/teams/datafangst-blaise deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-blaise +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-innfin b/reconcilers/teams/datafangst-innfin deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-innfin +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-kart b/reconcilers/teams/datafangst-kart deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-kart +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-m2m b/reconcilers/teams/datafangst-m2m deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-m2m +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-person b/reconcilers/teams/datafangst-person deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-person +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/datafangst-planle b/reconcilers/teams/datafangst-planle deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/datafangst-planle +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/dftjen b/reconcilers/teams/dftjen deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/dftjen +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/el-pris-volum b/reconcilers/teams/el-pris-volum deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/el-pris-volum +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energ-ind-korttid b/reconcilers/teams/energ-ind-korttid deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energ-ind-korttid +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-ereb b/reconcilers/teams/energi-ereb deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energi-ereb +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-fjernvarme b/reconcilers/teams/energi-fjernvarme deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energi-fjernvarme +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-industri b/reconcilers/teams/energi-industri deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energi-industri +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-petrole b/reconcilers/teams/energi-petrole deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energi-petrole +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/energi-rapp b/reconcilers/teams/energi-rapp deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/energi-rapp +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/etlev b/reconcilers/teams/etlev deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/etlev +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/famvern b/reconcilers/teams/famvern deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/famvern +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/fastlegetj b/reconcilers/teams/fastlegetj deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/fastlegetj +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finmark b/reconcilers/teams/finmark deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/finmark +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finpop b/reconcilers/teams/finpop deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/finpop +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/finregn b/reconcilers/teams/finregn deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/finregn +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/folksim b/reconcilers/teams/folksim deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/folksim +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-isolert b/reconcilers/teams/forbruk-isolert deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forbruk-isolert +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-stat b/reconcilers/teams/forbruk-stat deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forbruk-stat +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forbruk-transak b/reconcilers/teams/forbruk-transak deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forbruk-transak +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/fordelingsregnska b/reconcilers/teams/fordelingsregnska deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/fordelingsregnska +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forsk-mismatch b/reconcilers/teams/forsk-mismatch deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forsk-mismatch +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forsk-nhm b/reconcilers/teams/forsk-nhm deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forsk-nhm +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-forsk b/reconcilers/teams/forskteknar-forsk deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forskteknar-forsk +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-narin b/reconcilers/teams/forskteknar-narin deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forskteknar-narin +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/forskteknar-tek b/reconcilers/teams/forskteknar-tek deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/forskteknar-tek +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/funkhem b/reconcilers/teams/funkhem deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/funkhem +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/hack-fnrleting b/reconcilers/teams/hack-fnrleting deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/hack-fnrleting +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/helseforhold b/reconcilers/teams/helseforhold deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/helseforhold +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/helsetjko b/reconcilers/teams/helsetjko deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/helsetjko +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/infoforvaltning b/reconcilers/teams/infoforvaltning deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/infoforvaltning +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/inntekt-hushold b/reconcilers/teams/inntekt-hushold deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/inntekt-hushold +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/itinfra-bakkesyst b/reconcilers/teams/itinfra-bakkesyst deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/itinfra-bakkesyst +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/itinfra-ks b/reconcilers/teams/itinfra-ks deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/itinfra-ks +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/keycloak b/reconcilers/teams/keycloak deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/keycloak +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kombolig-kostra b/reconcilers/teams/kombolig-kostra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kombolig-kostra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kosthald b/reconcilers/teams/kosthald deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kosthald +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kostra b/reconcilers/teams/kostra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kostra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/krim-og-rett b/reconcilers/teams/krim-og-rett deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/krim-og-rett +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-biblmuseum b/reconcilers/teams/kultur-biblmuseum deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kultur-biblmuseum +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-kultmed b/reconcilers/teams/kultur-kultmed deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kultur-kultmed +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kultur-trokirke b/reconcilers/teams/kultur-trokirke deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kultur-trokirke +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/kurs-fra-kilde b/reconcilers/teams/kurs-fra-kilde deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/kurs-fra-kilde +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/laerermod b/reconcilers/teams/laerermod deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/laerermod +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/lb-sky b/reconcilers/teams/lb-sky deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/lb-sky +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar b/reconcilers/teams/levekaar deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/levekaar +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar-arbeid b/reconcilers/teams/levekaar-arbeid deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/levekaar-arbeid +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/levekaar-barn b/reconcilers/teams/levekaar-barn deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/levekaar-barn +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/livskvalitet b/reconcilers/teams/livskvalitet deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/livskvalitet +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/lotte b/reconcilers/teams/lotte deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/lotte +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/makro-demec b/reconcilers/teams/makro-demec deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/makro-demec +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/metode-naceomlegg b/reconcilers/teams/metode-naceomlegg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/metode-naceomlegg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/metode-sesong b/reconcilers/teams/metode-sesong deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/metode-sesong +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/microdata b/reconcilers/teams/microdata deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/microdata +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/microdata-no b/reconcilers/teams/microdata-no deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/microdata-no +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/mikrodata-oppdrag b/reconcilers/teams/mikrodata-oppdrag deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/mikrodata-oppdrag +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/naturregnskap b/reconcilers/teams/naturregnskap deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/naturregnskap +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nr b/reconcilers/teams/nr deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/nr +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nr-likningsmodul b/reconcilers/teams/nr-likningsmodul deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/nr-likningsmodul +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/nspek b/reconcilers/teams/nspek deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/nspek +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/off-fin b/reconcilers/teams/off-fin deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/off-fin +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/opera-forretning b/reconcilers/teams/opera-forretning deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/opera-forretning +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/papis b/reconcilers/teams/papis deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/papis +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pasient b/reconcilers/teams/pasient deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/pasient +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-chatbot b/reconcilers/teams/play-chatbot deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-chatbot +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-datafangst b/reconcilers/teams/play-datafangst deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-datafangst +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-dba b/reconcilers/teams/play-dba deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-dba +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-enhjoern-a b/reconcilers/teams/play-enhjoern-a deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-enhjoern-a +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-ffunk-edit-a b/reconcilers/teams/play-ffunk-edit-a deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-ffunk-edit-a +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-ffunk-edit-b b/reconcilers/teams/play-ffunk-edit-b deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-ffunk-edit-b +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-foeniks-a b/reconcilers/teams/play-foeniks-a deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-foeniks-a +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-lab b/reconcilers/teams/play-lab deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-lab +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-mabl-test b/reconcilers/teams/play-mabl-test deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-mabl-test +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-obr b/reconcilers/teams/play-obr deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-obr +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-obr-b b/reconcilers/teams/play-obr-b deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-obr-b +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-skatt b/reconcilers/teams/play-skatt deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-skatt +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/play-skyinfra-a b/reconcilers/teams/play-skyinfra-a deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/play-skyinfra-a +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pleie b/reconcilers/teams/pleie deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/pleie +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/poc-composer b/reconcilers/teams/poc-composer deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/poc-composer +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pop-lb-eiendom b/reconcilers/teams/pop-lb-eiendom deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/pop-lb-eiendom +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pop-mat-gb b/reconcilers/teams/pop-mat-gb deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/pop-mat-gb +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-j-reg b/reconcilers/teams/primaer-j-reg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/primaer-j-reg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-j-skjema b/reconcilers/teams/primaer-j-skjema deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/primaer-j-skjema +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/primaer-jakt b/reconcilers/teams/primaer-jakt deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/primaer-jakt +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/prisstat b/reconcilers/teams/prisstat deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/prisstat +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/proj-aiml-edit b/reconcilers/teams/proj-aiml-edit deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/proj-aiml-edit +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/pseudo-comp-test b/reconcilers/teams/pseudo-comp-test deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/pseudo-comp-test +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-a-ordningen b/reconcilers/teams/reg-a-ordningen deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/reg-a-ordningen +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-bof b/reconcilers/teams/reg-bof deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/reg-bof +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-freg b/reconcilers/teams/reg-freg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/reg-freg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reg-matrikkel b/reconcilers/teams/reg-matrikkel deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/reg-matrikkel +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/reiseliv-korttid b/reconcilers/teams/reiseliv-korttid deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/reiseliv-korttid +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/royk b/reconcilers/teams/royk deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/royk +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sikkerhetssenter b/reconcilers/teams/sikkerhetssenter deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/sikkerhetssenter +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sirius-editering b/reconcilers/teams/sirius-editering deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/sirius-editering +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/skatt-naering b/reconcilers/teams/skatt-naering deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/skatt-naering +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/skatt-person b/reconcilers/teams/skatt-person deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/skatt-person +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sosial-kvp b/reconcilers/teams/sosial-kvp deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/sosial-kvp +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sosialhjelpk b/reconcilers/teams/sosialhjelpk deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/sosialhjelpk +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/speshelse b/reconcilers/teams/speshelse deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/speshelse +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/ssbno b/reconcilers/teams/ssbno deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/ssbno +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/stat-skog b/reconcilers/teams/stat-skog deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/stat-skog +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/statbank b/reconcilers/teams/statbank deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/statbank +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-arbkost b/reconcilers/teams/strukt-arbkost deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/strukt-arbkost +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-kraftnarin b/reconcilers/teams/strukt-kraftnarin deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/strukt-kraftnarin +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-miljoe b/reconcilers/teams/strukt-miljoe deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/strukt-miljoe +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-mva b/reconcilers/teams/strukt-mva deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/strukt-mva +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/strukt-naering b/reconcilers/teams/strukt-naering deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/strukt-naering +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/sup b/reconcilers/teams/sup deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/sup +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/suv-altinn b/reconcilers/teams/suv-altinn deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/suv-altinn +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tannhelse b/reconcilers/teams/tannhelse deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/tannhelse +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tech-coach b/reconcilers/teams/tech-coach deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/tech-coach +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tidsbruk-survey b/reconcilers/teams/tidsbruk-survey deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/tidsbruk-survey +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/tip-tutorials b/reconcilers/teams/tip-tutorials deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/tip-tutorials +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-baat b/reconcilers/teams/transport-baat deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-baat +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-bil b/reconcilers/teams/transport-bil deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-bil +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-fly b/reconcilers/teams/transport-fly deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-fly +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kollekt b/reconcilers/teams/transport-kollekt deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-kollekt +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kostind b/reconcilers/teams/transport-kostind deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-kostind +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-kostra b/reconcilers/teams/transport-kostra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-kostra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/transport-lastbil b/reconcilers/teams/transport-lastbil deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/transport-lastbil +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/trygd-person b/reconcilers/teams/trygd-person deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/trygd-person +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/uh-tjenester b/reconcilers/teams/uh-tjenester deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/uh-tjenester +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/uh-varer b/reconcilers/teams/uh-varer deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/uh-varer +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-bhgskole b/reconcilers/teams/utd-bhgskole deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-bhgskole +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-inter b/reconcilers/teams/utd-inter deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-inter +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-kompetanse b/reconcilers/teams/utd-kompetanse deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-kompetanse +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-nudb b/reconcilers/teams/utd-nudb deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-nudb +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-tverr b/reconcilers/teams/utd-tverr deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-tverr +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-uhfagskole b/reconcilers/teams/utd-uhfagskole deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-uhfagskole +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utd-vg b/reconcilers/teams/utd-vg deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utd-vg +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/utslipp-luft b/reconcilers/teams/utslipp-luft deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/utslipp-luft +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-avfall b/reconcilers/teams/var-avfall deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/var-avfall +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-avlop b/reconcilers/teams/var-avlop deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/var-avlop +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-materialstrom b/reconcilers/teams/var-materialstrom deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/var-materialstrom +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/var-vann-kostra b/reconcilers/teams/var-vann-kostra deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/var-vann-kostra +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/vare-tjen-korttid b/reconcilers/teams/vare-tjen-korttid deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/vare-tjen-korttid +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/verdsetting-bolig b/reconcilers/teams/verdsetting-bolig deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/verdsetting-bolig +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file diff --git a/reconcilers/teams/vof b/reconcilers/teams/vof deleted file mode 100644 index eca5f8b..0000000 --- a/reconcilers/teams/vof +++ /dev/null @@ -1 +0,0 @@ -13:12:38 08 07 2026 \ No newline at end of file From e1d672672667f7dc4494d3b747c7ff6391b845bb Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:02:50 +0200 Subject: [PATCH 4/9] update reconciler --- reconcilers/internal/cmd/reconciler/main.go | 4 +- .../internal/reconcilers/dummy/reconciler.go | 59 ------- .../reconcilers/google/ai/reconciler.go | 156 ++++++++++++++++++ 3 files changed, 158 insertions(+), 61 deletions(-) delete mode 100644 reconcilers/internal/reconcilers/dummy/reconciler.go create mode 100644 reconcilers/internal/reconcilers/google/ai/reconciler.go diff --git a/reconcilers/internal/cmd/reconciler/main.go b/reconcilers/internal/cmd/reconciler/main.go index 045f977..e9a9948 100644 --- a/reconcilers/internal/cmd/reconciler/main.go +++ b/reconcilers/internal/cmd/reconciler/main.go @@ -9,10 +9,10 @@ import ( "syscall" "time" - "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/dummy" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/entraid/gcpsyncer" entraidreconciler "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/entraid/group" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/github/team" + "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/google/ai" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/google/groupserviceaccounts" "github.com/statisticsnorway/dapla-ctrl/reconcilers/internal/reconcilers/parquedit" @@ -133,7 +133,7 @@ func run(ctx context.Context, cfg *config.Config, log logrus.FieldLogger) error reconcilerManager.AddReconciler(githubTeam) } - reconcilerManager.AddReconciler(dummy.New()) + reconcilerManager.AddReconciler(ai.New()) log.WithField("duration", time.Since(start).String()).Debug("Added reconcilers to manager") diff --git a/reconcilers/internal/reconcilers/dummy/reconciler.go b/reconcilers/internal/reconcilers/dummy/reconciler.go deleted file mode 100644 index 7e5e16e..0000000 --- a/reconcilers/internal/reconcilers/dummy/reconciler.go +++ /dev/null @@ -1,59 +0,0 @@ -package dummy - -import ( - "context" - "fmt" - "os" - - "github.com/sirupsen/logrus" - "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient" - "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient/protoapi" -) - -const ( - reconcilerName = "stat:dummy" -) - -type reconciler struct{} - -func New() *reconciler { - return &reconciler{} -} - -// Configuration implements [reconcilers.Reconciler]. -func (r *reconciler) Configuration() *protoapi.NewReconciler { - return &protoapi.NewReconciler{ - Name: r.Name(), - DisplayName: "Our new dummy reconciler", - Description: "n/a", - } -} - -// Name implements [reconcilers.Reconciler]. -func (r *reconciler) Name() string { - return reconcilerName -} - -// Reconcile implements [reconcilers.Reconciler]. -func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { - f, err := os.Create("teams/" + daplaTeam.Slug) - if err != nil { - return fmt.Errorf("create team file: %w", err) - } - - resp, err := client.Teams().GetFeatures(ctx, &protoapi.GetFeaturesRequest{Slug: daplaTeam.Slug}) - if err != nil { - return err - } - - for _, feat := range resp.Features { - fmt.Fprintf(f, "%s\t%s\n", feat.Name, feat.Env) - } - - return nil -} - -// Delete implements [reconcilers.Reconciler]. -func (r *reconciler) Delete(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { - panic("unimplemented") -} diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go new file mode 100644 index 0000000..2b666d5 --- /dev/null +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -0,0 +1,156 @@ +// Reconciler which enables Google's Vertex AI (Gemini Enterprise Agent Platform) +// and sets the right IAM permissions for Dapla teams. +package ai + +import ( + "context" + "fmt" + + "github.com/sirupsen/logrus" + "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient" + "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient/protoapi" + "google.golang.org/api/cloudresourcemanager/v3" + "google.golang.org/api/serviceusage/v1" +) + +const ( + reconcilerName = "stat:ai" +) + +type reconciler struct{} + +func New() *reconciler { + return &reconciler{} +} + +// Configuration implements [reconcilers.Reconciler]. +func (r *reconciler) Configuration() *protoapi.NewReconciler { + return &protoapi.NewReconciler{ + Name: r.Name(), + DisplayName: "Vertex AI reconciler", + Description: "Enables Vertex AI (Gemini Enterprise Agent Platform) in Dapla Teams", + } +} + +// Name implements [reconcilers.Reconciler]. +func (r *reconciler) Name() string { + return reconcilerName +} + +// Reconcile implements [reconcilers.Reconciler]. +func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { + resourceManagerService, err := cloudresourcemanager.NewService(ctx) + if err != nil { + return err + } + + serviceUsageService, err := serviceusage.NewService(ctx) + if err != nil { + return err + } + + testProjectID, err := projectExists(resourceManagerService, daplaTeam.Slug) + + if err != nil { + return err + } + + if testProjectID == nil { + return fmt.Errorf("No test project found for team %s", daplaTeam.Slug) + } + + aiFeatureIsEnabled, err := isAIFeatureEnabled(ctx, client, daplaTeam.Slug) + + if err != nil { + return err + } + + vertexAIEnabled, err := isVertexAIEnabled(serviceUsageService, *testProjectID) + + if err != nil { + return err + } + + if aiFeatureIsEnabled && !vertexAIEnabled { + setVertexAIEnabled(serviceUsageService, *testProjectID, true) + } else if !aiFeatureIsEnabled && vertexAIEnabled { + setVertexAIEnabled(serviceUsageService, *testProjectID, false) + } + + return nil +} + +// Check if the AI feature is enabled in the API database for a given team. +func isAIFeatureEnabled(ctx context.Context, client *apiclient.APIClient, daplaTeamSlug string) (bool, error) { + + resp, err := client.Teams().GetFeatures(ctx, &protoapi.GetFeaturesRequest{Slug: daplaTeamSlug}) + if err != nil { + return false, err + } + + var aiFeatureIsEnabled bool + + for _, feat := range resp.Features { + // For now we only check if it's enabled in the test environment + if feat.Name == "ai" && feat.Env == "test" { + aiFeatureIsEnabled = true + } + } + + return aiFeatureIsEnabled, nil +} + +// Check if the vertexai API is enabled in a given Google project +func isVertexAIEnabled(svc *serviceusage.Service, projectID string) (bool, error) { + name := fmt.Sprintf("projects/%s/services/aiplatform.googleapis.com", projectID) + service, err := svc.Services.Get(name).Do() + if err != nil { + return false, err + } + return service.State == "ENABLED", nil +} + +// Enable or disable the vertexAI API in a given google project +func setVertexAIEnabled(svc *serviceusage.Service, projectID string, enabled bool) error { + name := fmt.Sprintf("projects/%s/services/aiplatform.googleapis.com", projectID) + if enabled { + op, err := svc.Services.Enable(name, &serviceusage.EnableServiceRequest{}).Do() + if err != nil { + return err + } + if op.Error != nil { + return fmt.Errorf("enable Vertex AI API for project %q: %s", projectID, op.Error.Message) + } + return nil + } + + op, err := svc.Services.Disable(name, &serviceusage.DisableServiceRequest{}).Do() + if err != nil { + return err + } + if op.Error != nil { + return fmt.Errorf("disable Vertex AI API for project %q: %s", projectID, op.Error.Message) + } + return nil +} + +// Check if a dapla test project exists for a given dapla team +func projectExists(svc *cloudresourcemanager.Service, daplaTeamSlug string) (*string, error) { + resp, err := svc.Projects.Search().Query(fmt.Sprintf("projectId:%s", daplaTeamSlug)).Do() + if err != nil { + return nil, err + } + + for _, project := range resp.Projects { + if testProjectID := daplaTeamSlug + "-t"; project.ProjectId == testProjectID { + return &testProjectID, nil + } + } + + return nil, nil +} + +// Delete implements [reconcilers.Reconciler]. +func (r *reconciler) Delete(ctx context.Context, client *apiclient.APIClient, daplaTeam *protoapi.Team, log logrus.FieldLogger) error { + panic("unimplemented") +} From 8cc108d5b457b4de26edbebff8d0c58862775099 Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Thu, 9 Jul 2026 16:16:00 +0200 Subject: [PATCH 5/9] add TODO --- reconcilers/internal/reconcilers/google/ai/reconciler.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go index 2b666d5..aa37499 100644 --- a/reconcilers/internal/reconcilers/google/ai/reconciler.go +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -71,6 +71,9 @@ func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, return err } + // TODO: Set or remove IAM permissions: + // - Give ssb.aiplatform.user to $TEAM_NAME-developers group + // - Give ssb.aiplatform.user to dapla SA if aiFeatureIsEnabled && !vertexAIEnabled { setVertexAIEnabled(serviceUsageService, *testProjectID, true) } else if !aiFeatureIsEnabled && vertexAIEnabled { From 6895fb446c6f0632abe8f56ca0e091cb6e65aacb Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:49:29 +0200 Subject: [PATCH 6/9] reconciler: reconcile IAM permissions --- .../reconcilers/google/ai/reconciler.go | 87 ++++++++++++++++++- 1 file changed, 83 insertions(+), 4 deletions(-) diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go index aa37499..744a1c1 100644 --- a/reconcilers/internal/reconcilers/google/ai/reconciler.go +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -5,6 +5,7 @@ package ai import ( "context" "fmt" + "slices" "github.com/sirupsen/logrus" "github.com/statisticsnorway/dapla-ctrl/api/pkg/apiclient" @@ -14,7 +15,10 @@ import ( ) const ( - reconcilerName = "stat:ai" + reconcilerName = "google:ai" + aiPlatformUserRole = "ssb.aiplatform.user" + // For SAs in the test environment + groupSANameTemplate = "developers@dapla-group-sa-t-57.iam.gserviceaccount.com" ) type reconciler struct{} @@ -72,17 +76,92 @@ func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, } // TODO: Set or remove IAM permissions: - // - Give ssb.aiplatform.user to $TEAM_NAME-developers group // - Give ssb.aiplatform.user to dapla SA if aiFeatureIsEnabled && !vertexAIEnabled { - setVertexAIEnabled(serviceUsageService, *testProjectID, true) + if err := setVertexAIEnabled(serviceUsageService, *testProjectID, true); err != nil { + return err + } + + if err := reconcileAIPlatformUserBinding(ctx, resourceManagerService, client, daplaTeam.Slug, *testProjectID); err != nil { + return err + } + } else if !aiFeatureIsEnabled && vertexAIEnabled { - setVertexAIEnabled(serviceUsageService, *testProjectID, false) + if err := setVertexAIEnabled(serviceUsageService, *testProjectID, false); err != nil { + return err + } } return nil } +// Get the Dapla teams' developers group name if it exists +func getDevelopersGroup(ctx context.Context, client *apiclient.APIClient, daplaTeamSlug string) (*string, error) { + teamDevelopersGroup, err := client.Groups().Get(ctx, &protoapi.GetGroupRequest{ + Name: daplaTeamSlug + "-developers", + }) + + if err != nil { + return nil, err + } + + return &teamDevelopersGroup.Group.Name, nil +} + +// Ensures a dapla team's developers group and corresponding SA has the AI Platform user role on the project. +func reconcileAIPlatformUserBinding(ctx context.Context, svc *cloudresourcemanager.Service, client *apiclient.APIClient, daplaTeamSlug, projectID string) error { + // TODO: Perhaps we can assume these standard dapla groups will always exist + // so we don't need to query google cloud? + daplaDevelopersGroup_, err := getDevelopersGroup(ctx, client, daplaTeamSlug) + if err != nil { + return fmt.Errorf("get developers group: %w", err) + } + + daplaDevelopersGroup := fmt.Sprintf("group:%s", *daplaDevelopersGroup_) + // This SA is always guaranteed to exist as long as we run this reconciler **after** + // the groupSA reconciler + daplaDevelopersGroupSA := fmt.Sprintf("serviceAccount:%s-%s", daplaTeamSlug, groupSANameTemplate) + members := []string{daplaDevelopersGroup, daplaDevelopersGroupSA} + policy, err := svc.Projects.GetIamPolicy(projectID, &cloudresourcemanager.GetIamPolicyRequest{}).Context(ctx).Do() + if err != nil { + return fmt.Errorf("get IAM policy for project %q: %w", projectID, err) + } + + bindingIndex := slices.IndexFunc(policy.Bindings, func(binding *cloudresourcemanager.Binding) bool { + return binding.Role == aiPlatformUserRole + }) + + if bindingIndex != -1 { + binding := policy.Bindings[bindingIndex] + missingMembers := slices.DeleteFunc(slices.Clone(members), func(member string) bool { + return slices.Contains(binding.Members, member) + }) + + if len(missingMembers) == 0 { + return nil + } + + binding.Members = append(binding.Members, missingMembers...) + _, err = svc.Projects.SetIamPolicy(projectID, &cloudresourcemanager.SetIamPolicyRequest{Policy: policy}).Context(ctx).Do() + if err != nil { + return fmt.Errorf("set IAM policy for project %q: %w", projectID, err) + } + return nil + } else { + // If the binding doesn't exist, create it. + policy.Bindings = append(policy.Bindings, &cloudresourcemanager.Binding{ + Role: aiPlatformUserRole, + Members: members, + }) + + _, err = svc.Projects.SetIamPolicy(projectID, &cloudresourcemanager.SetIamPolicyRequest{Policy: policy}).Context(ctx).Do() + if err != nil { + return fmt.Errorf("set IAM policy for project %q: %w", projectID, err) + } + return nil + } +} + // Check if the AI feature is enabled in the API database for a given team. func isAIFeatureEnabled(ctx context.Context, client *apiclient.APIClient, daplaTeamSlug string) (bool, error) { From abee67e4989ad79b39889e36f9d651000eac1fea Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:53:48 +0200 Subject: [PATCH 7/9] remove TODO this is now implemented --- reconcilers/internal/reconcilers/google/ai/reconciler.go | 2 -- 1 file changed, 2 deletions(-) diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go index 744a1c1..3860971 100644 --- a/reconcilers/internal/reconcilers/google/ai/reconciler.go +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -75,8 +75,6 @@ func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, return err } - // TODO: Set or remove IAM permissions: - // - Give ssb.aiplatform.user to dapla SA if aiFeatureIsEnabled && !vertexAIEnabled { if err := setVertexAIEnabled(serviceUsageService, *testProjectID, true); err != nil { return err From 1fb6244849f4af56506e03a90a69e2cdbdf4f1ee Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:55:04 +0200 Subject: [PATCH 8/9] add spacing --- reconcilers/internal/reconcilers/google/ai/reconciler.go | 1 + 1 file changed, 1 insertion(+) diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go index 3860971..2ceef08 100644 --- a/reconcilers/internal/reconcilers/google/ai/reconciler.go +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -120,6 +120,7 @@ func reconcileAIPlatformUserBinding(ctx context.Context, svc *cloudresourcemanag // the groupSA reconciler daplaDevelopersGroupSA := fmt.Sprintf("serviceAccount:%s-%s", daplaTeamSlug, groupSANameTemplate) members := []string{daplaDevelopersGroup, daplaDevelopersGroupSA} + policy, err := svc.Projects.GetIamPolicy(projectID, &cloudresourcemanager.GetIamPolicyRequest{}).Context(ctx).Do() if err != nil { return fmt.Errorf("get IAM policy for project %q: %w", projectID, err) From 58e11bfd02b72a9f05fb72a455626f2967e80434 Mon Sep 17 00:00:00 2001 From: skykanin <3789764+skykanin@users.noreply.github.com> Date: Fri, 10 Jul 2026 14:57:39 +0200 Subject: [PATCH 9/9] refactor --- reconcilers/internal/reconcilers/google/ai/reconciler.go | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/reconcilers/internal/reconcilers/google/ai/reconciler.go b/reconcilers/internal/reconcilers/google/ai/reconciler.go index 2ceef08..4f61d2b 100644 --- a/reconcilers/internal/reconcilers/google/ai/reconciler.go +++ b/reconcilers/internal/reconcilers/google/ai/reconciler.go @@ -85,9 +85,7 @@ func (r *reconciler) Reconcile(ctx context.Context, client *apiclient.APIClient, } } else if !aiFeatureIsEnabled && vertexAIEnabled { - if err := setVertexAIEnabled(serviceUsageService, *testProjectID, false); err != nil { - return err - } + setVertexAIEnabled(serviceUsageService, *testProjectID, false) } return nil