From f0352bbc23b9a7be10da47eb7c5fd99acfe867a9 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Mon, 20 Apr 2026 15:05:56 +0200 Subject: [PATCH 01/22] feat: add migration for project_invites table creation and deletion --- .../migrations/1776685923398_migration.down.sql | 1 + .../migrations/1776685923398_migration.up.sql | 14 ++++++++++++++ 2 files changed, 15 insertions(+) create mode 100644 internal/store/management/migrations/1776685923398_migration.down.sql create mode 100644 internal/store/management/migrations/1776685923398_migration.up.sql diff --git a/internal/store/management/migrations/1776685923398_migration.down.sql b/internal/store/management/migrations/1776685923398_migration.down.sql new file mode 100644 index 00000000..d7ba7900 --- /dev/null +++ b/internal/store/management/migrations/1776685923398_migration.down.sql @@ -0,0 +1 @@ +DROP TABLE IF EXISTS project_invites; \ No newline at end of file diff --git a/internal/store/management/migrations/1776685923398_migration.up.sql b/internal/store/management/migrations/1776685923398_migration.up.sql new file mode 100644 index 00000000..0f8d8f78 --- /dev/null +++ b/internal/store/management/migrations/1776685923398_migration.up.sql @@ -0,0 +1,14 @@ +CREATE TABLE project_invites ( + id UUID PRIMARY KEY DEFAULT uuid_generate_v4(), + project_id UUID REFERENCES projects(id) ON DELETE CASCADE, + inviter_admin_id UUID NOT NULL REFERENCES admins(id) ON DELETE SET NULL, + invitee_email VARCHAR(255) NOT NULL, + token VARCHAR(50) NOT NULL, + + role VARCHAR(50) NOT NULL, + CHECK (role IN ('support', 'client', 'editor', 'admin')), + + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), + expires_at TIMESTAMPTZ NOT NULL, + accepted_at TIMESTAMPTZ +) From 73e20bb0095c9681a23f25113d8f36d4db130e17 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Mon, 20 Apr 2026 16:46:22 +0200 Subject: [PATCH 02/22] feat: implement project invite creation functionality --- console/src/oapi/management.generated.ts | 112 ++++++++ .../http/controllers/v1/management/invites.go | 75 ++++++ .../v1/management/oapi/resources.yml | 94 +++++++ .../v1/management/oapi/resources_gen.go | 246 ++++++++++++++++++ internal/rbac/model.go | 1 + internal/store/management/invites.go | 63 +++++ .../migrations/1776685923398_migration.up.sql | 5 +- internal/store/management/store.go | 2 + internal/wasm/test/action.wasm | Bin 507196 -> 507336 bytes internal/wasm/test/provider.wasm | Bin 598785 -> 602061 bytes 10 files changed, 596 insertions(+), 2 deletions(-) create mode 100644 internal/http/controllers/v1/management/invites.go create mode 100644 internal/store/management/invites.go diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index b1b4657a..4f0737bf 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -672,6 +672,26 @@ export interface paths { patch?: never; trace?: never; }; + "/api/admin/projects/{projectID}/invites": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Create a project invite + * @description Creates a new project invite for an email address + */ + post: operations["CreateProjectInvite"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/admin/projects/{projectID}/subjects/users": { parameters: { query?: never; @@ -4633,6 +4653,70 @@ export interface components { channel?: string; }; }; + CreateProjectInvite: { + /** + * Format: email + * @example user@example.com + */ + email: string; + /** + * @example admin + * @enum {string} + */ + role: "owner" | "admin" | "editor" | "viewer"; + /** + * @description Duration until the invite expires (e.g. "24h", "7d"). Optional, defaults to 24 hours. + * @example 24h + */ + expires_in?: string; + }; + ProjectInvite: { + /** + * Format: uuid + * @example 9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d + */ + id?: string; + /** + * Format: uuid + * @example 4c9d3163-7b64-4f9e-9068-d2e4b96be56b + */ + project_id?: string; + /** + * Format: uuid + * @example 5143f27c-cca9-4dc4-9059-e1dbb08144ad + */ + inviter_admin_id?: string; + /** + * Format: email + * @example user@example.com + */ + invitee_email?: string; + /** + * @example admin + * @enum {string} + */ + role?: "owner" | "admin" | "editor" | "viewer"; + /** + * @description Unique token for the invite link + * @example a1b2c3d4e5f6a1b2c3d4 + */ + token?: string; + /** + * Format: date-time + * @example 2025-12-31T23:59:59Z + */ + expires_at?: string; + /** + * Format: date-time + * @example null + */ + accepted_at?: string | null; + /** + * Format: date-time + * @example null + */ + revoked_at?: string | null; + }; }; responses: { /** @description Error response */ @@ -6193,6 +6277,34 @@ export interface operations { default: components["responses"]["Error"]; }; }; + CreateProjectInvite: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + }; + cookie?: never; + }; + requestBody: { + content: { + "application/json": components["schemas"]["CreateProjectInvite"]; + }; + }; + responses: { + /** @description Project invite created successfully */ + 201: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProjectInvite"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; listUsers: { parameters: { query?: { diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go new file mode 100644 index 00000000..feae00f0 --- /dev/null +++ b/internal/http/controllers/v1/management/invites.go @@ -0,0 +1,75 @@ +package v1 + +import ( + "encoding/base64" + "math/rand" + "net/http" + + "github.com/google/uuid" + "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" + "github.com/lunogram/platform/internal/http/json" + "github.com/lunogram/platform/internal/rbac" + "github.com/lunogram/platform/internal/store/management" + "go.uber.org/zap" +) + +type InviteController struct { + logger *zap.Logger + mgmt *management.State + engine *rbac.Engine +} + +func NewInviteController(logger *zap.Logger, mgmt *management.State, engine *rbac.Engine) *InviteController { + return &InviteController{ + logger: logger, + mgmt: mgmt, + engine: engine, + } +} + +func randomString(n int) string { + b := make([]byte, n) + rand.Read(b) + return base64.URLEncoding.EncodeToString(b)[:n] +} + +func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Create, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + body := oapi.CreateProjectInviteJSONRequestBody{} + err = json.Decode(r.Body, &body) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("email", string(body.Email))) + logger.Info("creating project invite") + + actor := rbac.FromContext(ctx) + InviterAdminID := actor.ID + + token := randomString(50) + + expiresIn := "24h" + if body.ExpiresIn != nil { + expiresIn = *body.ExpiresIn + } + + invite, err := srv.mgmt.CreateProjectInvite(ctx, projectID, InviterAdminID, string(body.Email), body.Role, token, expiresIn) + if err != nil { + logger.Error("failed to create project invite", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger.Info("Created project invite", zap.String("invite_id", invite.ID.String())) + + response := invite.OAPI() + json.Write(w, http.StatusOK, response) +} diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index 6ded2443..9fb534fb 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -1706,6 +1706,39 @@ paths: $ref: "#/components/schemas/Admin" default: $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/invites: + post: + summary: Create a project invite + description: Creates a new project invite for an email address + operationId: CreateProjectInvite + tags: + - Admins + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + requestBody: + required: true + content: + application/json: + schema: + $ref: "#/components/schemas/CreateProjectInvite" + responses: + "201": + description: Project invite created successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProjectInvite" + default: + $ref: "#/components/responses/Error" /api/admin/projects/{projectID}/subjects/users: get: @@ -8896,6 +8929,67 @@ components: type: string channel: type: string + + CreateProjectInvite: + type: object + required: + - email + - role + properties: + email: + type: string + format: email + example: "user@example.com" + role: + type: string + enum: [owner, admin, editor, viewer] + example: admin + expires_in: + type: string + description: Duration until the invite expires (e.g. "24h", "7d"). Optional, defaults to 24 hours. + example: "24h" + + ProjectInvite: + type: object + properties: + id: + type: string + format: uuid + example: "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d" + project_id: + type: string + format: uuid + example: "4c9d3163-7b64-4f9e-9068-d2e4b96be56b" + inviter_admin_id: + type: string + format: uuid + example: "5143f27c-cca9-4dc4-9059-e1dbb08144ad" + invitee_email: + type: string + format: email + example: "user@example.com" + role: + type: string + enum: [owner, admin, editor, viewer] + example: admin + token: + type: string + example: "a1b2c3d4e5f6a1b2c3d4" + description: Unique token for the invite link + expires_at: + type: string + format: date-time + example: "2025-12-31T23:59:59Z" + accepted_at: + type: string + format: date-time + nullable: true + example: null + revoked_at: + type: string + format: date-time + nullable: true + example: null securitySchemes: HttpBearerAuth: diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index f50662f5..1092f7ff 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -63,6 +63,14 @@ const ( CreateListTypeStatic CreateListType = "static" ) +// Defines values for CreateProjectInviteRole. +const ( + CreateProjectInviteRoleAdmin CreateProjectInviteRole = "admin" + CreateProjectInviteRoleEditor CreateProjectInviteRole = "editor" + CreateProjectInviteRoleOwner CreateProjectInviteRole = "owner" + CreateProjectInviteRoleViewer CreateProjectInviteRole = "viewer" +) + // Defines values for CreateScheduleOffsetRequestDirection. const ( CreateScheduleOffsetRequestDirectionAfter CreateScheduleOffsetRequestDirection = "after" @@ -125,6 +133,14 @@ const ( OrganizationRoleOwner OrganizationRole = "owner" ) +// Defines values for ProjectInviteRole. +const ( + ProjectInviteRoleAdmin ProjectInviteRole = "admin" + ProjectInviteRoleEditor ProjectInviteRole = "editor" + ProjectInviteRoleOwner ProjectInviteRole = "owner" + ProjectInviteRoleViewer ProjectInviteRole = "viewer" +) + // Defines values for ProjectPushProviderPlatform. const ( ProjectPushProviderPlatformAndroid ProjectPushProviderPlatform = "android" @@ -520,6 +536,18 @@ type CreateProject struct { Timezone string `json:"timezone"` } +// CreateProjectInvite defines model for CreateProjectInvite. +type CreateProjectInvite struct { + Email openapi_types.Email `json:"email"` + + // ExpiresIn Duration until the invite expires (e.g. "24h", "7d"). Optional, defaults to 24 hours. + ExpiresIn *string `json:"expires_in,omitempty"` + Role CreateProjectInviteRole `json:"role"` +} + +// CreateProjectInviteRole defines model for CreateProjectInvite.Role. +type CreateProjectInviteRole string + // CreateProvider defines model for CreateProvider. type CreateProvider struct { Data *json.RawMessage `json:"data,omitempty"` @@ -1074,6 +1102,24 @@ type ProjectAdminList struct { Total int `json:"total"` } +// ProjectInvite defines model for ProjectInvite. +type ProjectInvite struct { + AcceptedAt *time.Time `json:"accepted_at"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` + Id *openapi_types.UUID `json:"id,omitempty"` + InviteeEmail *openapi_types.Email `json:"invitee_email,omitempty"` + InviterAdminId *openapi_types.UUID `json:"inviter_admin_id,omitempty"` + ProjectId *openapi_types.UUID `json:"project_id,omitempty"` + RevokedAt *time.Time `json:"revoked_at"` + Role *ProjectInviteRole `json:"role,omitempty"` + + // Token Unique token for the invite link + Token *string `json:"token,omitempty"` +} + +// ProjectInviteRole defines model for ProjectInvite.Role. +type ProjectInviteRole string + // ProjectList defines model for ProjectList. type ProjectList struct { // Limit Maximum number of items returned @@ -2309,6 +2355,9 @@ type SendTestJSONRequestBody = SendTest // UploadDocumentsMultipartRequestBody defines body for UploadDocuments for multipart/form-data ContentType. type UploadDocumentsMultipartRequestBody UploadDocumentsMultipartBody +// CreateProjectInviteJSONRequestBody defines body for CreateProjectInvite for application/json ContentType. +type CreateProjectInviteJSONRequestBody = CreateProjectInvite + // CreateJourneyJSONRequestBody defines body for CreateJourney for application/json ContentType. type CreateJourneyJSONRequestBody = CreateJourney @@ -2659,6 +2708,11 @@ type ClientInterface interface { // ListEmailTemplates request ListEmailTemplates(ctx context.Context, projectID openapi_types.UUID, params *ListEmailTemplatesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateProjectInviteWithBody request with any body + CreateProjectInviteWithBody(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) + + CreateProjectInvite(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListJourneys request ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3777,6 +3831,30 @@ func (c *Client) ListEmailTemplates(ctx context.Context, projectID openapi_types return c.Client.Do(req) } +func (c *Client) CreateProjectInviteWithBody(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateProjectInviteRequestWithBody(c.Server, projectID, contentType, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + +func (c *Client) CreateProjectInvite(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewCreateProjectInviteRequest(c.Server, projectID, body) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListJourneysRequest(c.Server, projectID, params) if err != nil { @@ -7972,6 +8050,53 @@ func NewListEmailTemplatesRequest(server string, projectID openapi_types.UUID, p return req, nil } +// NewCreateProjectInviteRequest calls the generic CreateProjectInvite builder with application/json body +func NewCreateProjectInviteRequest(server string, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody) (*http.Request, error) { + var bodyReader io.Reader + buf, err := json.Marshal(body) + if err != nil { + return nil, err + } + bodyReader = bytes.NewReader(buf) + return NewCreateProjectInviteRequestWithBody(server, projectID, "application/json", bodyReader) +} + +// NewCreateProjectInviteRequestWithBody generates requests for CreateProjectInvite with any type of body +func NewCreateProjectInviteRequestWithBody(server string, projectID openapi_types.UUID, contentType string, body io.Reader) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/invites", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), body) + if err != nil { + return nil, err + } + + req.Header.Add("Content-Type", contentType) + + return req, nil +} + // NewListJourneysRequest generates requests for ListJourneys func NewListJourneysRequest(server string, projectID openapi_types.UUID, params *ListJourneysParams) (*http.Request, error) { var err error @@ -13923,6 +14048,11 @@ type ClientWithResponsesInterface interface { // ListEmailTemplatesWithResponse request ListEmailTemplatesWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListEmailTemplatesParams, reqEditors ...RequestEditorFn) (*ListEmailTemplatesResponse, error) + // CreateProjectInviteWithBodyWithResponse request with any body + CreateProjectInviteWithBodyWithResponse(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) + + CreateProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) + // ListJourneysWithResponse request ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) @@ -15394,6 +15524,29 @@ func (r ListEmailTemplatesResponse) StatusCode() int { return 0 } +type CreateProjectInviteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON201 *ProjectInvite + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r CreateProjectInviteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r CreateProjectInviteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ListJourneysResponse struct { Body []byte HTTPResponse *http.Response @@ -18432,6 +18585,23 @@ func (c *ClientWithResponses) ListEmailTemplatesWithResponse(ctx context.Context return ParseListEmailTemplatesResponse(rsp) } +// CreateProjectInviteWithBodyWithResponse request with arbitrary body returning *CreateProjectInviteResponse +func (c *ClientWithResponses) CreateProjectInviteWithBodyWithResponse(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) { + rsp, err := c.CreateProjectInviteWithBody(ctx, projectID, contentType, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreateProjectInviteResponse(rsp) +} + +func (c *ClientWithResponses) CreateProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) { + rsp, err := c.CreateProjectInvite(ctx, projectID, body, reqEditors...) + if err != nil { + return nil, err + } + return ParseCreateProjectInviteResponse(rsp) +} + // ListJourneysWithResponse request returning *ListJourneysResponse func (c *ClientWithResponses) ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) { rsp, err := c.ListJourneys(ctx, projectID, params, reqEditors...) @@ -21166,6 +21336,39 @@ func ParseListEmailTemplatesResponse(rsp *http.Response) (*ListEmailTemplatesRes return response, nil } +// ParseCreateProjectInviteResponse parses an HTTP response from a CreateProjectInviteWithResponse call +func ParseCreateProjectInviteResponse(rsp *http.Response) (*CreateProjectInviteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &CreateProjectInviteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 201: + var dest ProjectInvite + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON201 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseListJourneysResponse parses an HTTP response from a ListJourneysWithResponse call func ParseListJourneysResponse(rsp *http.Response) (*ListJourneysResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -24716,6 +24919,9 @@ type ServerInterface interface { // List email starter templates // (GET /api/admin/projects/{projectID}/email/templates) ListEmailTemplates(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListEmailTemplatesParams) + // Create a project invite + // (POST /api/admin/projects/{projectID}/invites) + CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID) // List journeys // (GET /api/admin/projects/{projectID}/journeys) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) @@ -25325,6 +25531,12 @@ func (_ Unimplemented) ListEmailTemplates(w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusNotImplemented) } +// Create a project invite +// (POST /api/admin/projects/{projectID}/invites) +func (_ Unimplemented) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID) { + w.WriteHeader(http.StatusNotImplemented) +} + // List journeys // (GET /api/admin/projects/{projectID}/journeys) func (_ Unimplemented) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) { @@ -27940,6 +28152,37 @@ func (siw *ServerInterfaceWrapper) ListEmailTemplates(w http.ResponseWriter, r * handler.ServeHTTP(w, r) } +// CreateProjectInvite operation middleware +func (siw *ServerInterfaceWrapper) CreateProjectInvite(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.CreateProjectInvite(w, r, projectID) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListJourneys operation middleware func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.Request) { @@ -32791,6 +33034,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/email/templates", wrapper.ListEmailTemplates) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites", wrapper.CreateProjectInvite) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys", wrapper.ListJourneys) }) diff --git a/internal/rbac/model.go b/internal/rbac/model.go index f4c77e6d..514ee823 100644 --- a/internal/rbac/model.go +++ b/internal/rbac/model.go @@ -185,6 +185,7 @@ func Model() []*openfgav1.TypeDefinition { {name: "broadcasts", read: "support", create: "editor", update: "editor", delete: "editor"}, {name: "scheduled", read: "support", create: "client", update: "client", delete: "editor"}, {name: "devices", read: "support", create: "client", update: "client", delete: "client"}, + {name: "invites", read: "admin", create: "admin", update: "admin", delete: "admin"}, } for _, r := range resources { diff --git a/internal/store/management/invites.go b/internal/store/management/invites.go new file mode 100644 index 00000000..3237da58 --- /dev/null +++ b/internal/store/management/invites.go @@ -0,0 +1,63 @@ +package management + +import ( + "context" + "time" + + "github.com/google/uuid" + "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" + "github.com/lunogram/platform/internal/store" + "github.com/oapi-codegen/runtime/types" +) + +func NewInvitesStore(db store.DB) *InvitesStore { + return &InvitesStore{db: db} +} + +type InvitesStore struct { + db store.DB +} + +type Invite struct { + ID uuid.UUID `db:"id"` + ProjectID uuid.UUID `db:"project_id"` + InviterAdminID uuid.UUID `db:"inviter_admin_id"` + invitee_email string `db:"invitee_email"` + token string `db:"token"` + Role string `db:"role"` + ExpiresAt time.Time `db:"expires_at"` + AcceptedAt *time.Time `db:"accepted_at"` + RevokedAt *time.Time `db:"revoked_at"` + CreatedAt time.Time `db:"created_at"` +} + +func (invite *Invite) OAPI() oapi.ProjectInvite { + role := oapi.ProjectInviteRole(invite.Role) + inviteeEmail := types.Email(invite.invitee_email) + + return oapi.ProjectInvite{ + Id: &invite.ID, + ProjectId: &invite.ProjectID, + InviterAdminId: &invite.InviterAdminID, + InviteeEmail: &inviteeEmail, + Token: &invite.token, + Role: &role, + ExpiresAt: &invite.ExpiresAt, + AcceptedAt: invite.AcceptedAt, + RevokedAt: invite.RevokedAt, + } +} + +func (s *InvitesStore) CreateProjectInvite(ctx context.Context, projectID uuid.UUID, inviterAdminID string, inviteeEmail string, role oapi.CreateProjectInviteRole, token string, expiresIn string) (*Invite, error) { + stmt := ` + INSERT INTO invites (project_id, inviter_admin_id, invitee_email, role, token, expires_at) + VALUES ($1, $2, $3, $4, $5, NOW() + $6::interval) + RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` + + var invite Invite + err := s.db.GetContext(ctx, &invite, stmt, projectID, inviterAdminID, inviteeEmail, role, token, expiresIn) + if err != nil { + return nil, err + } + return &invite, nil +} diff --git a/internal/store/management/migrations/1776685923398_migration.up.sql b/internal/store/management/migrations/1776685923398_migration.up.sql index 0f8d8f78..eec6d9be 100644 --- a/internal/store/management/migrations/1776685923398_migration.up.sql +++ b/internal/store/management/migrations/1776685923398_migration.up.sql @@ -8,7 +8,8 @@ CREATE TABLE project_invites ( role VARCHAR(50) NOT NULL, CHECK (role IN ('support', 'client', 'editor', 'admin')), - created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(), expires_at TIMESTAMPTZ NOT NULL, - accepted_at TIMESTAMPTZ + accepted_at TIMESTAMPTZ, + revoked_at TIMESTAMPTZ, + created_at TIMESTAMPTZ NOT NULL DEFAULT NOW() ) diff --git a/internal/store/management/store.go b/internal/store/management/store.go index 259f2f64..30796d42 100644 --- a/internal/store/management/store.go +++ b/internal/store/management/store.go @@ -23,6 +23,7 @@ func NewState(db store.DB) *State { BroadcastsStore: NewBroadcastsStore(db), ProjectPushProvidersStore: NewProjectPushProvidersStore(db), VapidKeysStore: NewVapidKeysStore(db), + InvitesStore: NewInvitesStore(db), } } @@ -44,4 +45,5 @@ type State struct { *BroadcastsStore *ProjectPushProvidersStore *VapidKeysStore + *InvitesStore } diff --git a/internal/wasm/test/action.wasm b/internal/wasm/test/action.wasm index a0c4885fcc1299dcd79ed8461c8d7ca95166dfb4..597576070fa8c5c962b10b0589748cd6ff801f3d 100644 GIT binary patch delta 32791 zcmb`w2YgjU(>Q#0&z^HrNq~ej2sfd(gc^{3>Ag2;(o5(?ksdlI{Q`^h5(K3i;7}zX z3J4-fP#^&Tqkx8@f}%wD&&(;g0sQ{&`+eW@{NnD}ot>GTot>SX-Mt+BC;H5@=si2s z0$IsXi+M4Jd(UO9oWmjN2Cw3f_ncHKxlUcyN;w==6^DztU5W1VUY{is-D#ISp<1ar zN6pe;7k~u^L9ym?xWf~%rNe=Z;4|3z1eEaUV|^aIoHAMaSK<3EdnWlssemg+^^95< znR39dCiBa9CT-Ji~xZz`eKztea zNOZAmKZnB~inNm45u>=&hN7-Zabukuc+B>v%9NnMH<5L8fZKg6F*d*F)4W0a(Y2JX z^EPDp?p{MyV?_e5>=G^~fTtACKa2$!JVrvBn^!&SLn3(QHP7LYDeSuEjnIKS>zZd% zXdEWrh8FR{(GPGq0Efp}pftaG%~PpB5&rm^r%QpYA&-D1Y~L#O@yNfIQQAZX!ITs(m%GdGLzaRs`?*jUxYk;tg$Z;b+^}P|uJeTQHliXa`IN6m{o@vp2(lq-nDESRUeu+YsexS*klC*zWhM`kY8r+?A z)l(y`RFAAJnhQ((T>)-K5f+7t!`yebXz<^~=~}QOMqs&{H45~Pbcq;l$~Eh%=KkGL z-GK^b78w+HVywSG;r><6iMaelkph;uLE(`KYvg7?C>I^i)3`!DfHEm*MPj-Ci0TAe)o|P}eVelg>6fW^vA!ofJWKXXO1#P~;k9pVxILsbXP1bGc_@#o{s0 zAv8oB2CsRb;(m3QJa;Qb*YqA4-`8L?M#k3|8K?Kiz+9^H#yp%-7psQ7Zc5dyRimzj z9uyvoZ-CqHKS}s`kx=bfNdC+ZfZ&SHtbE9kZB6G~UZWeew# zZ=_3$5#~Gs1TpT=W@u@gZdm)k2SU8}(UP4dOBjeNiD{j&7HPb0u`+0I&))h4&_187 zA4T@n>4rtn$G}R9-~+-c5NoU;yq;@rFJWZ6qnaA*utcL7t$;scvjD|=>2tclben>p zrH^1-KHjK%)$=y}^+?XE>Q(w5%J%nqxn=vh1`Mt)OsV$SmznpeDc)A23MITwG1;≫AHy3b5!n(1Sc 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%0Dy_*#9(}7|bpTcz2v+-GPb2fH?G$rC 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 delta 32668 zcmb`w2YgjU(=dK_&z^Hb3JH*qM#4?#EujXaUwZFNM5LF{n{)_8iqv?4MS6*X(hYE^ z5)dQ^B0|(aA|gfssVXQ64}3FoN^SuE@B93}?|FW4_w3Hj&dkov&d%;$(w{^h`6qh! zcD3-$l*pyLgu}fxL#yC$i26aRIOIJi)GDqc8Cn^Kqq^d7F}EwxebVc*bfWuQh9^WT zQ*WhVRbsyzO7zCnG}(%I}7ceg5&~ z;3Lt+p87f*eo&;9=8hP}r8XAzU5Xp)+(6?~KdMX(40w(C&AviFs(bboPsjX^I3z6s z=R=bEO<*FMZdAt>03rZFb19JV50kkTb7#rjkZ^z_!FU{t$4!39?QxK@#%MxP?c|I)=$ZuXw z{i;A?R`A+oBsEqf@TxB1asqg2$wI@Jzd>UJw8_l$tPc+7*_S;Q- zQ3FC!JC3p~e2IP_^dynP8p12K>p4Mf0Ad+omic;6-%2q_s zXJxBnQoYG6+?DtHYvmb+o-RFnpH z=VW?n#g%z8Cq;8%iJ!~g?I^|~QE{02T8ak$op(hGa>NKMce5q|ei1Ga!%ey7WNPl; z9W@=OU}llg15b?gGkW+r({ntoP;u-5OWdIF*b8goX3$ZdemsxkqI>{lVk~z*^0+F6 zH#U$dHo3n*rTY z{`f!17CIytmqDpwio=$4D2Q5pMYoht3qV{Vm zg`4ePkl!EF-kU1V_m#Zl_uOb7T{+4eWYr$zo4N8g2AKzlJcI1>Du$9O7v*=Bc{Wxq z83PQVA>uH2Edvzy%fsZkSvk74_sHaX1x90J@);xJ^d1?QOZ8rxk5lSG_0U&Msrq$l z)wj@t!h`Ykcl-Wp7rtIysP-)KjH=qz;zaS{1hv%`2T~OfPd{Oz^kkOD{k`tYZv*wx_E(`H8o0G-24|> z7Wl7S1$uR5+1CG!mT@pk6>CNmx6G2Evq4_iULbr$%?dbQ?dcJ#cux@Y9%xYj6Rdjf zRF0rYLOum(aDjg%zkpYVUgX!WHT(a2k|6ozYkOIRHnk(L#i**KJ@3_?^*=YBTF0yL z`Z`u)p1v9kK}hO9bvE%5Cc92^4#CP#7Qu=0C;%CD;ygNDzc?|AC4R2JSFTSeT@9Bl zoJaX0Tw07U=Mf-?afh@(OXGCI+6O)m;{6#d*%`8g0l1Qw)){NDk5?^LMjza>r(t2V z&u1D&l6`f$VG;B(u+k!UkFW~F8Y>8|=Zf1)7*E}i%?)x`qS1_2z+bSLzv8|0Io)8o zO+nDoM=&lQZ`8dSc$@wPB_H2Qxj)Z|89LfzE}g_?S{(Od=9zEiWgw6Kttn%V^FaJN}SoHIq6dlBVs z9)c~qH6O@aDJfbLoWPs4CZi!eX{JZabd9HI%h2iIGE!}ZnVvJ#?Pj{hOc$EzY%_hj z(P;P3OtZ~2!%WYaX^NRXSZ}}|S!edQ7ShHso^dTFOrK{Enr#x6VW#KIbg!9iH`Avk z33tpi$4r-5-)5I5%`|6&(d9XlgxO}AgrqcvE!^8J15+orYRqaH)*;3h_C?13jjfY2 zfVq6hVhFMpzGy9+IFWq8TEMKn=kSbZ>mv6Ki~U^r|0l=U2VDrKZ7?+VEt-pY9A{rN z9yAwy$#}$?P+&`NqB~6kf)Litz4!>95^n_<#SHpB4g$P&eB zVE1#takhwml`ZmAYFnDLkhnL=0xcZUwm52Ga$9fxZ5vSn1mk}EFHC8M>|i%=uWcCZ z2C#&f0MWh5Gxn5i7l~7$X}bnQgbxk@q47b3y}Dhgp=cBG7Q^m3!2O*g5qAh^!J5Pb zfSHE9UgH4nhYSOOUj6=yC5mvHhDeLZb(G@TmqT*iXn%>wp;ghWg-uue4h1;w$vSo_ zkI9Tq^)NZn$&HEH`4}XrpLcfI8#93$v){TL#q!-|O!(Ts52(Q1< zAWsk=zDF%YIkZPdOpf>H>|L80^X3A(3kACfOe*fl>Ny2r1CuIv=Dg*>Z2P_mp7y<} zg`}mxN-w}0@N=<5+)7iNVRf&j-bg)nd)>Ca3Fl9}KeX^2=pzk$L;eNV*M0NgN-frJ zfK8w;61c4YZbS~&YAb93@_EvF7WVWXFcPtTH=tRbe#;I-ad~bH{0NfNWrNn(m~dn5 z={dQWr)MIunw{7xPs^C`A)aPK7GmpfhqSP&sQ+?9H)HXIp#!aA+LSjKMvP?*t85kL z$3DV_uSe*E!#}f%&8|CmE{|x1Ri#EYd8z7)kyI5n>gB4#qo^w1=$EUukEW`BUQxAn z3{~A8^Kz@jW2q{8?8{Zt$5GXn+M=r6^(Sv_)S=RYJ6j> znAi=OKr%ZtVS-g`B3g&g-%spg6$hZqT1=wiUndQ=icOhO@w3T!sTnqfiUXz&vY-h` z($wXMJ9L`IDkdcRrtQJvLDOHeiiz&+(|coaVA4t>so?oGi4>#LjLulHZN@}QO3qwl z22eZ)XBM-v*UfBFhR1K#6M#$gnLRnLsx5v8Lp-T5b6T+c=ETj9W(CS7&K<-E)3r;f zH|EV`2sh;2zw@+D9kEd77Qq~4RB6dO2zX#gZb!sO-DH|-za$TL&fW~+y`XS8<2xn9 zGxEI~R>!c{_dyi>Js$%KPl06v3gNW&n$&1dJnt@Bkw1O47Q_6lsF>#mPq?S)@_ZCAt^_^Wt6Tv3ImrFgPdRLE0N+0#o_#fla3-m5DL zz7K=D+4IT!Z7gAHt6EvvZmaAen30?PcvUe!Bgmx%g}eRagMnJ8=l-hDJRQV)-dOz_ z^}M=hJ{#H-SR@?4QZKI#w#AQ%Dt|nw1bh6~rmHAZChvFVA#%fIrg?K?-kaW`ocW58m1c%Xe)}Aho*jQM6r86EJAoPJ=e; z;o7!PyV{8=z<10+@@DL;=sC2bO0Jd&8f(Px-p=U;MBi7{dj8ru7ORKtnvLE3v8#zS zboF-IqnNyV0#^F%nM4{ZKx5s5v=A9pg}3qC-!s!&u%4p(i+EOkl7L7rd_r=qpZeVk z5T!iL_hP^sAUb+V?E`h)?5Usnx@Yaa@h?D95Eh~G>o(MEeW3+K6DslmEXA8W*#}5O zPY(>USKfjNd^fGU6At*D6U(NlGKT5@7SY36Efckw8p7jPkdpQ2jeJ}KS|97oUB6O;Kyb-SoV}GGWDyI zqiE+z-3q8EnSJ(6Cm{CbAf zl-B>^7vD#DAEP9-`=$LhI4Nr6H?1&A?irj3llh7#-{nD=jJf<1Cf%--=65!EW?rd_ zUnj1(&0anEvff6)&&VRdZ_MgqBPG?n^ix|;`|sbQ8Od=*7WQ1o>54eY{M^m6>*`#K zLV|YxumYFa6x(?qL{+5dI# zHg?~O!VLQk0dT}Y5fTPbYY^@Ep9`{R)B1-c@M}1#nhW*|#*Ul2Q&K$7ei_7bHhb#b zEb5tiqccB=*>KNaH=6Jxm@R=^47dri_KN55tzw?nZY3F6uoPE3-GA+6(HMk7dg|8$ zSUmkUxh7$E>}8ggkazBE=4%jXth$#9+TY!W;6C?`7&wc0Cf_aOd3vuue)hdTz`{+y z8TWVlEri_`?0evQbLx@@w{G`RH?= zVZc9rRF9uCvTgpXC-)a-p`MgK-F%Hv_Vmv!7CLgZcK-DyA_#bVk}otMZazM0K~RUg z|Bge5Yk!}@WXnJ4d^Q4RTR^1n-JaIwdpCPlJgsjPlQRGKG!+}I_)j{2x{=r!_bkg= zJK@}nB-``(>j-r4IdUX-3Kk=qE3Dx1eGJD#R%fgn;FkRuYv7Gs?qLkaPWI*uNwZs` zgDM{?495!#>HBrn{;ndMXly)I9@7lecQlsAQI>U`Yy$#ZbF!=aAyF>B@nLSBO?kaS zJ{Dn5p~9dZvV$*ch%IXSv7&OnF9Rb@AJq8`Kck;u|J;7iqm={v*9?rU3{oq8Gm%%(mH>{IQdHRoN}-WK04Z zX;VDO+s1ejR z!_Fe_L6j`enjOYo&bMY&x?nuSfngHr#bHFMd?6M>p&l%Reg41o5n)BPS#HpS&e`Sh z$4ac6*oM^`Xhh3m={zb1G_t-CEn{$(0Q)8m@j?V~2(cInQX_QJ7>5n*0B8(7A)p_u zHgK@~!hy3a+LmEZQzo=!=d3ZJ!3$`|2DywiHwK*%?9+t-ZugxOx+vjrKTOe=w__gC zg0dZ0EWeo|+jL;K&C!Q+faz|Xy@PFQ5IhJ&2cHHT~Hd$mE(h+&3qab%X-!!?a_m&}@zHhNN ztY#K>d4x*MuD)e98_^qt2|`)eo0YPfS-#K9%`Ww}ghGlT;IsjS;^!6f16(uu8UwVh zFB`-nK!kWg1=2thi(~9VW0ajKUHw_p1ek`X=c94lvyIa%hxdAorci zvcLdVILN$NB484Uv52wy0ESm`WZXcuhp&N+=v{2EIE6!%Jl5#YRri{YgTC?MtV zQ|d!6E3e2(gIMTvDn*Wsxq~wUs{xT&*a+Ea0_~xQuD;-P9#S&ARAWK4GWy8AtQEsL zKddrT5$zj60k7?dMMr5KWS9xXB~K4xmH5^S`OhHMG!z9udZ@UQSYmNUpdXL|Ja!w* zqWlme5(x!*(qQ%)i!=piOeV5BoUW3%Z(f!eiR>OOT2uft-IZ9}v!`Pe+>?@j3}Ls- zws=#-AWCsxAi2Y!%D;w!k{`&D<%hB6eBl*2ei$q1x6BwNxUzFa-#QFd@!*Ak9nVLg z1Y(GoS$0J)GJ?gj;FDQqRXSvd=yO@J!$@`$EkW&3UjPt)nJL$f zW`hyjXAJv?thpG+VkrI#%}qNC)+|$29|w*}PKtbY9E&LGbsTG3Rgr5|*Yo#R&Ea-~wG41@z;N=(z)38MWy=baSSlnxP6Br<=dye+Ir?7X#^f;BhEpp;Y)yX5Y9AloURrl5&Or!advh_1hEJC)&9RNkM;s$yC{i3Q8o zrm@b2up7J#gZGnMc-Jd?v)nk1RW{L-TQQxzWsL-(N}T=@s=+T~$sjD@@|z?ETOIm{ zl2v9HW_i#I)*C%t=qFs}%m9e(^bsqY&SXJeJ(ra`XR>N}y1zH`rS5}e=B!t7@^lmS z5L@IV12e_YP=NZUS#rBcn^4JSu|j(CY!*n@@L(dtlm>Cg3hy$PJogT(%X2p2QMrtn z!x#*dYdwjq01zn&NG19&Sy7x&PKx6`d!u?7eiED z#At574gb$&?4jl7@3N`Rcjl##UmiMK348)wKvgIqAz+0%(A(^RQ~A zNat!;eW6*o)v!-MDihbR;@EuY8grqIS;r1{2C@=(5tvtSCYr#*VDf=&54OH>_iCC4 z#GY%yAW#8u++61hTEmjT5sN!%ovgH;wjg@j^{kprDs4TMY+(H@+EIx5^9^h<(YIt1 z!)>^JY!l19!ANQln8HT9x=r|ptQxjy_aUoi`_#Ar!0}zXg?7(+>#eMcO#~_5f{#Fy z(5%GAEH{Qp8?&a{U^#%A_qM@?%<2=@C%yJg=7)6Z&37?yn+&`lltDxc^n=UnGb~Jg z`f2V=BN@y&277M6S}lzQ5p_+Evz8QgC#u}}D6$Wdncm9&~v_(t~$*1QTMjmD9uh?`7m0o~QX~k6{M1J-av;k_ezGAtNfAo;` ze=e}+G)JFYVr6Xop}lkbw_vs{S<@J<&ScH7gP$|mdcW;((RLnOr=&DxSVrQSOdWaqi9wEuNSaYwo^KarUm!V(7gWDpub!Dr(<8= zs?hx(umbi7(|DBr9l{8};)UPY3X5JE!cl*)lca^Jbp6SqWw(bc$O1rtueb>w#@vT& zBepL4h*h#GahRYoO3r#jCQL^CnOlikMU`*=X^d3BUlgg*OZ~;V+u?hhGy1|OY%zS>^w+Yj7dZw>kNFn!c0s@if1shMuXYXH9&0B?vjoiN3rY zl6=;eH{}N|>A`+H%VrE$HT|DRK89wD5z3~k3xz*EW;;T!XssU7RSS6qq2N?8Lx=~GbRY! z9CFMRH*8M?%%8vZ;hl9PnwR4m<0mgcz>05zRNq;iccKCj$46r~6XIU(X2<`&2bmGi zOCX*n@w_djtt#?an0{T6*YGDo*W`m8KZrV{60fA8wOE-UTUFw=S4B4KMkW419s?jN z^SD5`p9MFAa(#`A%6zUpva|>fsLH>@QIXZE^Ani9@NI*nT zN9yp`ZKw)$UjY?`s}SzjOl})EV*K2|K3++5Ic2XO)S}X-9`{F)`1!?f>-mOWtR8P| zTPV;j)OR_pK6mFK;g`;w(K0k=*7B??y@Y4vwDlj--yLkl~oTV93G~jk{i3TUD z0iTzL`{50FMMSfqA-Byf>FAY)FF=9>LQ29ijB2@Rzp0jntJ~nY^*=|9KkzEy5EpL` z=(QU26ZYw2R06+1mfXK7uNr*d5?oqxvzP)P7ne916YU1w?$nfDLh0@p$fNWo&3HMQ z>bv{%Q2B0iJ`=0*x8RGd$wVITmKI#cie4@G>sAGEaIz(*fOh{@yhaE@5T5G+vb$QT5AXKLs;?pV9;#CuY+AO6hOzjv7&Dxw+~OO ziV*olBBxa^X$Y_RVza_BYY3;Kn*~F8HNc^t7|O5PbB;pfyN2^J0;{f!=9+DtQF{9A zxA}aWj{4gZ`AoYN9>nU(Wd0gf$+}bd9t8PqDnDRruK7?)>eFGf20-_xa|%Y!PT~Xb z`%aP}#aT0WL;OykLBk{m&jhOs-&bey6_~y~ix0DSG6LhXIC%z(X7e|!3gklmF`IvY zEmpn5;WP_udfHj1Cd89=RaFWNoxXDfPpmi ziwwg06?{J;=_+|on>o1XLo3^7utUL9rRML0MTRtB6@Lb)9z+VNdu#vO!gNR2&UCYHdyCc`ed zV8WcUOVTlCu!4^RDJ&r4Qh1ne?nY2=m%^K%Cm~mU#Bp;XFMh-)Sppy)yMD~+0QB<5 zde&I34NyP=;s+d1B9&@1oY5ON>}w&LXp2#2)Z$$J|mX=cfxoxC2= z<3k%$UD?GS8+WH3Uy=||Es2=Q>;Wrj?I^%Xl4AY+3Ezcue4GlaI{-!R<)vxTHQUeM z#)7o{yf77H9^hjUvduyM7%Q3`LjMB_mK}!szEJS(VLp-ynjPicu^{CrEWQX);TSkH zP>^+up9-`nfW0e8X6IKNhx(u~$auk%CVl5$XlBY?zZjh~yTKC?XS-WqcFx@3 zTk&JeO+LgTiAMa^P2S&x`VmuTRa|!cl{YdA+sNC$8p7Lho7c2^Mvq9pbB7PY5!Jig z(9RXFcL&ZAkKqgZ|>(NiBvxHk_U0$Hv?!^fwtb zecj(Yk$Ulc0<+j6o>*`3)UbcwKP6U|S5!h|&;J<9p!VzqP5~%Fu6RZh4ItadO3w{j z2NkjM=5yWzSb>Tg$Wb^`rh4lEdBZ7O>1Pu_3RXxcbn<*mD9ILOlIX5WAWmG$~;66R!AZD!wbP}?`E_X$`FO-+tUzbBUY|2tV}Xl zK*B5zAlOYe!eo_DB?I8}d|}ESTd*X*Q{l=9j84ptP&#mUf2e<7M0tWLLZrCCgS;zCySsl@+|U zAYZGZY_mG1h3PNKO2kz-oZ~HEITegKk2aE3<6H!ik}8ZlScHZvJSg z499Nzwo;baPG~qzEZ$y02UG5Auk^M0FY4WYA*=tY9h6Lj%-@mvmpwZwVfa0vqmqqj zmre@$(YjA(ctC8;Q4n(y&C%jrmG3S5p$UAR;&K}Nft$CK){Cfa%CFcy-|NbZybDlZ zFHqg|9twI9dW$!eL$)w!8G>q5K>cJdWrxi_jntGrMop!@ips3sLAtrUL*UTvJyZ_v zr+fyOWL$rxqNQPEulxon!{vAVmBv^bJwVxQ)skhNJXk3qpA8`TWYRz-$*Q&5()>sp z^l~#aBzkP3GSKG8qPvPbJ=8$hd|0mWwD=8`)rKo{TJ_Cv#lC4pK1JOT3eIHtXoNBZ zwWH5Sr4N38KGHCTp`(<0`0X66pc5d!8LiOD=^g_b2;Z-dQJz7nzdlyUy<1G-tV`p- zJb`s8^|sOnwMt(wUKwex8?f|I|M?~=Um~8&iONY#*G*E2V%qzbT1Z};r2K{-rzR_3 zW4dyRGSCthDS_`)@ZX@~@KjnD1_QU)I! zQf8r*!6%7S0&z7XbI!_SG`Dha@84{X_gJxey3mT5HC73Pm5i#BRwe~rA`)=UX4!6w zB8eS%*lQkY!$k~1)yN#Yv_)*lo|#1k%`CELW|2uVi)@-%WYo+et7aCNHM7WWY!#yq z8CGUqeiAoacM~AUY;Z9? zR=&Xr6tYcu%Qi@`p&^4bbGu^S@h3Ybb|@4k8M*_UK?vvF-=PfU=QhbVcPh~|a4;8A z@M)>)&VepRLy7~9DT)MBloF<>8<@^EQ`8>(M!8~&qQ(@Zk0}larVGs!#|^)6C^3Cl z$;{x0V*x4wrpB{apv(L=p2Y$|>-2KFlo^cZj`ab_VHu2@ktHQFvZQ22mXyrMl9Cx& zQZge;N@iq9$&4&1nUO{M%`QmCd`eNz$fj9*E;ma`W+ImV>{eWHq+~`3DVdQ)A)BpJ zK>TJlXS2RxkJ15xA)DmGPhg~Aocp9I5SRxGbzrYjuPj<9hiRc4cwwbHe1c6Y4vA^6 zxM8nk%syq5KUgEMVXfgJR7RFuw@+Dsn9A)}BKXNovgv;EkoB|sl>)YfCo^?J&$Z~J zSbYx|Cim04{B>eF|&X!cF>LpThkNEC^2n?-J4uX-W#FkJHFq))S5^x#!=smX1B4^mKwU z(1S1cckpti$GQMn^)qFt)f2h?+dfk&z9Pnu0yjf0Lcq51$=ux@!Na?!Kj1F8{PvXL z&qsc)RJEC*1+DvOrMz82zH4&2vIL2ZJ)^vZ>8vwK4~qx_`1OpjzuWYMv6Y1HI63gF zvLGMmq8XWZa#opWqoqCh^e+{PU+de?E4%GQ6{*w*UIbGBUFqqUluEwded*$=Qdz;O z8b2z}L#!$sQoX@n$|z%Rf~Vnd6yx&rzFJLQh~`fH$z!FOz0qoH?&|b<|0t^Myj4RS zZJ#RnXr#LTNBIstuqw}#I86IKQ#!-*0eR?|VqX^`AAA=V^W~1`2!`8&VpZP7}j*fc_nlUD-8I|$V~ zNZ6rysy!A&tVmWs*v~R)|2wvTpqb9i48y&IUO{`gpXnF>}7HaJlQ#cZ2I zH;^c|7ZSA7FCHu?CcGzH`a!{x!K^w}V0Oa9f!hV@c!&JApXpbZ$7Z>ZSrep|fmJkE6>E;sR6iFqq zl)xRZ++0emvLGqK*Q_+0mjQ}}rNwFlC{spk!1QbxQ9YOfy=ne9@Cp1WoYUf%7cMKd z+G9>Q&Xg0a5JzZvkqJJz{#$u*+=d`UI~pfiAVj`+u?Vp1E8|56dny!1W*=1&6d<@; zS^R>Oe^W(_fzis4Evkt;7nkIrYB0diqIiOsW>9zpZlWTEvtc-q!u<)Ng55vK<6d<` zpKH|+-AJFwn5Zs4)MxPA9|8vS*>}_sZlv!)4Uzjofp!zeYr{~@swrwAacMQhpLPdU zHSSyV!gWMpZmCY?dg5bC*u>;Y_?10bvA*byS0Y^y8gjV&T~)Wowyv%OK@JG#ZZYRYG#~#jFm!>&`hftr%;VVK@{Yhjf}zh zsFB!V86j`TDhRZyu^4YZCC-OWiSyY{iS^P=#A{%ez@Ro2M#v}gl3dzUl<<1udt1h| zRKjFtQ&H0D1pGmp9IKN$a(Xk-F4tnvi)T6()UP)a4eU?}DPDYQaUO|#-dapE4S}51 zMxMow+bSeFYuphW$&|doX5a<}m2|dJHx!gEOX5_s5+CwDf zgI{qpZQPr0iX`i{ljrL)!P4c!ipwHBg{~Py%DY_zzRQ+CRUeu7mbi-~zTOMAG+y#F z!mnfch;}7t^6rLP&+ZNI!+4t4ZvevJ(Y?cAswFYJg5&9Ef{jEYMG1lj+V1I1vZcK<*@_Yl}1VIN^rgH?kJLsNUOVVTAa z7IRUO&jt%m(4CE1(^w5}*5l7W-q|QOCW?10LWshIAuv+`|HL5zBg*<0L&Q!NYlzCc z?ytecZ{vqjX#Mg5=K(OS8U{8K_851EiF$}2Zn!Z}Yla(Z@%7qogT%tc4C+N2w^`hfN7&os#!=(tE_~yF@xcCAy z-UoilQ|~-coFz?*oh(Y&mId`h?=VGVQ&q)jVwydZV;}~IPJ%o-9Vh~^{W4wjGOXcB z;mU`*{bi6s$62q1LQHhkw7dDAw?`_ zXN%DUQg4ohHlYe=!V14X`z72 z0GnmdB9UPYG+iIKzsT@WDlHbvki^rAMI}uCSu9GRb&Ode>fm>;C03{DW~V2OPUW{t z#HVJ<@=mye5BzMFXOZyAv{Q&(?@hD7H~+Nt^Xg)`|%8;NE$-wP{G>-ECVx!1=SiNz_RB+jY*DPo0-x|4RnE~P{Fh4}j+GA+(_j|-_?5FQ1;tZy7 zsn)DqYKm*2DbP)+Vu2}-cuafkHKZ_auZW`oyt`kNme=+f19fAch(=|1?gy6;prNt? zrbTq4ytZzamv&w=1>63BQ90^>=z+jr9T4R(eR@E2L}cv`8s5y}gQAmdI?<>Y7RvlJ zO1#$P13?{V*nYPfqK6+AWyu~jKH??61~`|0J_`PMQZ`--(1Sh|KiUgZBe(^HDzW0Y za7WO(1TR=z(dN+@F2OOhKYru5I7snNI7e}~O5k<+m=hv43O55(1Q*{E;D8<)mq_5* zkb?1)y-t8AA-#J-Bv__{(8YZwcIKjsG0}ww#KLv1F?fYs;H%HTlcFe@t%|3?VKG+_ zvaP*Ni|0nZH6aR&hfGtP+kIN&3uGzkXQ@N*y{BoUlsx{RN|_d+BL?fV5& zcvsJeZY7ELn-IQ5*pnD5qmm2ogau(AV_+8q-Qx=}9!Kh%FAUokde&I%{_~@#EEk>? zZ(7dI{j;K+efQ45y1~Y}Mj)>0=V*JX_dh4n8Go=|k3TPb70lH7TC~+HhA9rW{5!C* zz-YNl5oRkq)hxL$qU4avVji;p=(4fK54!?73*XDH2t2ISbFPRhf-n6*ru`r)^T+4) zhd-defC%3o#Vo5Q679+#MPFJ+c5%*z+LJHEQqk%3D#25G-`y1F}NPGTf!2kLi$P>P! zf4AX_$=<&U4;KFUyP!zU+&_#)pZ#GpYWold9_pt)G)4(1D&>{McJrZ#*m)4`xj~m^JZW*2IHZ zh)jR@SiFY({rFgH$~6u&?Uw#6qT{fqNN^Rg6{d&?Q^Xw^t3VDV5E%>iU4a`t`)~1k z-l=l=iD-u!RPL#<^0j{o@`vwvcSB=5u&3x4&p`h4shN09q-e;?g1CR=+ob0RGXO7nVikF4_R8kw5WC?PrpW4}) zX_^9VKfP7g8vBvKtnmw$*ocu5XF4bxQaE27%*m4YC4 zeQ%W7h)((bDXzY-z1v+<{X7qAGfJr#+to{zR@alimtIy)wZ|PTj6SEl8gG{n9cdL* zno1So)Poi_vZlYqsqGM3!*~_<%~$kk71h7&-+_P=aJpSFtBU$MheusktEl$v9@;ui zs;cgSU*nPGs;RNiTDGmGHm7(o`0Ebi5~06~F6V8prbgjXf3}*6o{e5MLCw8NMh;|9 zP4%or8_HMzrKZ}^W`iUSC2sjnZS^UJ#%9$~$0Mevb<`d<7^y|yda8Z5i?(Q&>!}zh zm67#T+7f!|t2Fb@*H=G|fBAF@Cs^JCC!B&*0@HSjTdjosUU7R#nY1prp}OY3M)yNQ z16{#JYVI=(V`JG^?b-mT%lp#?Fd1;(({GUwrEr~yYy*`LrC5U2BY?r>ZrS@&5g~6i zR`IZ0cQsL)=#Q+nJH-MRy0@X7$m*9+Q{x5nbbpDs{KgurnXXN+7G+B8ZU(OfOcwHdnEg-jcU3* z_erHUeW0Ghnvox>MeSJ(t8O#E3J?FlFg(rDwXJHnf|;0YYDre~sc}M$UJ|@%b;BpV zn^(}4tBTDAY*%SD^lVo*p%JLQ!!!b@&Hye)?@;4VB%5}qm$CDyJ5`;br+|(l@?#n@ zK}XsU+ki*K;H&oGAcN>VYOMTjx7rwA>%s>RxXCE|Xb%*^-K__E)c){#RCfJDZGye5 z|3v-E8WEbU8&hfW?BA<0TZ*(b_umJjiUf7quP(N$Xe)77SEq1zXg=fs4S`&HKplt3 zgAc0Y0c<#^c8xQC2tX0_@u@E`>xVxCKsjIn#N#l3X#jp77JgHp#36&gVTTM2`Sg(5 z0&)5tRy+N-xE3BZaAh1;$+dmsh?@KBVKl8Wj)IW^-ro6CZRveerv}N}$6W*OiBTL$ z-Z`cwRi(9~ex6ErY@fgz0Stt5n!pdCSP#k-2<$-VnsstRnpy;B!KZ1e?0`X^0L9ZggHM-4EjjiE%iLp3hiQIBrjmt-r^#jWEtH;&u z_BfIGYxtQ8VF!2(` z3;TyajM}oNRk|7zldg`VB^RQhYtmKYXAmLZ{tzoH(=I6*_WV=2y3nSH?Ea)LR5uFc z=oheJLR#^xTCFg3RvzxYpgdypfz@#$gOksy%`9cbMNOVRt2Qc1!0jON=aU%YpXWz8 zjPP=$bLv=RZp%5)QlO#4muiwt1G&q)&#U#Y@88a=!I(O~q89qpuhjk|r<@C_?YK|; zS}h-rGV*cHGkzou_B;@PVo(5WKmFPmbby0#60-A^wZqFa~L zSe6e}0W1VC82pWDA6U@LI{1x>$FO?%xA22Rg@{u)7DP=uzzk>T&F|D=@N-&n=6C8I zasvQ2o*Z6~$A3_hpzXm`6+M1k|3MvSOP(~c%#Y-0$gh5+g;qAZ zu6|B|v7c1h6ST`wLuKEe)Z5q`KB8$jM*gfWhXU#R1;!03n*E~Yp3D;79e33Y2+{VQ zIug_4_tcV7yQQ|XWI?Mx+zAUKgp+?Y^#94P200sV(@G|H|E6Zi)H~{ZtJ%LHf7=2e z9|G{6k$w*hqw_Dgb-;au;Y}9UN27kz;68>Nj_yOdd&FXlBj52_4rvK+=Q)Uybey#0qt7uwD}G~Ac`k7$y} zg^yIa!=CV`Iu`|a>`!$&q+5plm3!Pw7b_?Ht&Tu|TYsze4;a#s=WqY03!y@v{zScR zFRSEqOnk25f-BEGS3k7mh84@F!iyLv4`iC#Dkn_?Vxr^(rqN;|xVF)%wK^&!KjYd& zY+F~!ZA*J*YP&_z-pASoLc5RKAY4jSm`4Fk<)}0zRCZRiFsvV;8ht!bwX*nKO4De| zN=W)?RH;AEv`vgQQ}{#(1ixE&VrH+FHS=kq!#ofSx47AmM+C!Y!Ir|m|3R}kd;=d`9 zC67jEiP&qING*n^Y|>jrYOmX@k%H|mqJ4l6U8A(dc}Ck+PK%ODT$(1oh|UfSk$FG1^nBmIgaMmipDdjn$Uf6w$HOxZ>IhY!XmH z!#S%TE}^xs_gm(#MM^?mv9vayAWCbw4_(M1YFyTsi{F*i>RR0r$DGmzG>wiUGfSmBJ*_FJf^MS7gkqFcOXZ~4fkw6ChQfP4E|M{MS)sM)VN ztlDm}QY8(SRXL%OR@Fk9TN_x}sO?huRke4`+NxDvReQFI(Y9dKmuuHzmk+9HwXH5m zB-N{F`>^6(HBHBKOM+Gf)9eIoHl}^5Yji3wuezbEB>Gd;iFv(q4K4Tg2WYP7uW8Nc zr-d*q0Ke?~#t{)MUH24Ux#3GzTOVFiD`Ss$D9lcMQ!VXgIt*3rsi_bcmY ztt@&;bD*{*ROq$qYH!&063CQps;`lAFxssZwELhv)RG2T6`WZ5$%a~6yHN-lhv+8S z4eZC+RO@T?W9VU1Eek6;G$a1?3C%Q!_Cvwe=Gr>+vzoPl*$-)A3vDLY4SBBxDXu=J zrI!2KmZU?!wbGtr@4vU!-n17J8t?AywV_y(-d@Yy$rCdrI}$VU&yLzx7F{&2E_Bka zBN=-;YxcU0>x^El3rudTS=v?0!5{WAZUQOr?=L8M45GfIn|8tWo*;Bfah+k^bEh|T zH2w{37^3^-4Q*K-3g9|MJTHc=$>e*kT#lGGEtq}seGeDc+-CT#} zbmdBq9i*k(3PACrM}xJ^b_osd^Pynh(uQaq5LNI{gVk9>HT&MV1$7buP7TvCt)<7` zd+FId++2Df5(Mi0;?lEi1kegP^4kcFHcx>gwJEs9EE)+NTMrt`ntS=XqqRjo*xQuJ z+B=vkQw;MxVv1G=f$2x#{25LI{m>K*g4_VqV460Peka3MZk(yr$c2MIF2Ma~n%0)! z+9YX{O}OObm*IkEfbcAFk_N`j)P`dR>t<@T2rIsv_BTTGH)a~M=E5v(I>NM{t?i`C zI`H7dgwb4-Cu(K*I|fG^-q9$&RDZsSlVBiJ43zesqxll0!{!=}#t(D7fruShdLAv6 z^7uS$Dt7!TMDyos&+y`ioWIEEjV<=(fO?ZH78^r;aIxWfy$WXP674^TXUbA-6{cay z8tugvC!6@fkz0eX?~=7m0HaTS5A2pTvhYudU}#kCTc)KVg2d%oZ%n^juGJ}k1Bwm; z{OW=+rZRGcwh^m8T|rhsmY3RF_`OIPxGSyHTH9kpzUBP)4T_$>uU$dNtW}!*+=`~u zkE^ve=oNxuKHh?8li@f(#3l@U1oEbYJ10x_UZbTHPcdF0Kso(390D7^=?9(#{e~cp zRGGD~yjna~H+a-fuh%A__Ua9{YSH%HAGCk^(Cyk2v=RE?U0OTUY6yl07gGK7UabKg zar+(8>IK4`YS_Nz{t(COhqQyF6~RYf0{|>`J)%VgJ}`Iy@ntgi!z?-Lh&CnuvFZHy zfb;Xvd^7>SItTYsoUjSJX*YrGiQ>MKCF7226dadF!Qw32B-4*-i>w(y!P{P+YWv7l zHiETyC>eVURs%?z9n-4#EyG`^FHgAToMYMwt1+3+QfXR4occr4jH&-_nnrt(LdOkd z+I3uOhWz|}+_0PPoY3yz_n6PL1(5DPsr6&dhko2|I-4dhyvHJB%M8U|CZEz~SQ3Pd zFPU!F=UV$RnfL++PY58A4riU1G|T&Ywiyoh?T^nCk*hz~`a7);pVL}%es8txcv>4{ z7oI<@^|U{#rh~(txmp%Hqg~_K>*PaBVcfp`LhEB|Bgw1bIjtX0lXB_>t%y8zPSdr& z-q+lVR>_%PYO{SG!m~UUw2Zq|dHfqKSQbC8okBdf&x1?g#S-o1V=rj0^9`#Im3>)@ z{EN4~)^?(t4XuQc2)n3Nq*G^dI3RcccXHtu+AtjiZu+&=+KNlyb5Fmh`SY8r<)VwQ znF4-GU($+O<3+@Gy`&95`5(Ka^|vah$M_7b9e=c1&d4wvBIh?+fBtl}9R7{5jJ5n$ zd&tw*O80m0ednScoeAqdpPej|E~C%CL{Ga6nAuppRJL|QW##q2>srZn{7AB1y|Qy~ zVZJ6=ZffS7#Olka=FU*oNLFj^jL&yqF>}-&%^dyYu;$K|TGeFc*tTR%N#q$K&rQH;Vi^_(-$#EBZmWlOEp6 z$vNIwYvYt`sNCDe`3HZxRDRUf`5`~BSa09X2`fv+QhB+(b1uIeC;N18wu0YU+SS2X zjGs%E8699coLnmXJ31j?2b~}hLuJE`&ehOdUhC-mm1i%N=Q=sxX8y8aXJ;+ePfqXb ztWsboP}~8iT{ew5-h?zve%2XqrZ18=J3Cu2A**z8)+5eKPe(o`cX8q~+C}=_uD~{b zxKtOfJO5F%Y~b|MccpmKnOLyL0_JEohdG9rY0?5c=}l)(#&*jedOElCoIQ^@s)2Mm zfh6GHd?wh1P=;;Ro9U-!dJEF3^O?gJ{6Ek%|fBoREj+u^y6x*+US3Z5qxj(!< zz%_%vZva2Gp9JYxNT5(Ie#{t(4(D0?`UIX;8*8hl@Y6wyqP zrFuIL=fg2Q0iXTk?cUBda(f?VRCHnZz6s?I;15Aj8rWkPNWir~wj1aSmQVXQ^VdND z?6(tC+-1yB1o8s@u-})(X3((_U=gWHHtp*il0O|j5qBD-4;IL@zRuYG{tFFsK2Xl! zFBrb3fEr-42PS+)D60W~(}3M!y$27EYdB)~fWZR^2H}Y;v);l(WI-9?sUe&8a~4%M zz~@$Ztgkb?_Lz|)hL7nFRa8IL#BmN%WX&JSIsBo#y1~prTp1>=tqWyZKWB%4(m-QP zfN??EP8RL&ELLJHWU+a$+1z5K$P(u8m@KuE1N%Gcl}&?BoKZ*}Dt$Vn7tC)gAKQP- zSSWI2E|TZ^JEPU&Kt*|ZA9|_q6sjYjsvQ(zZ^*DWu^XU#0{kKB^0M9lXWN9`@QD@x z`M_cXK@Cnb!N@v{tc#u2jvraq@e7Q^xux>t0B2dAvs6A9;Ed4jEG3f>G|(BL7J->p zT*eP{MzS8Vf*N zxonWLWK0Gz!W<(fA%on}Zz`rRD?sx2T|{OLa>j$H^Be4}H@ydyGRJI6!yQ}AZy$ls zO&sUU?_NOFHz0}!^bJ!2M1WX*Mj2^+`flauM`juiS1bqocI_KhQ) zI05`EiDg7w99X{sfEgx>sQ>tf1nu@iy>8;jHtSF)u?~rA0oJZNeB~s|;6!JoLU2pU zFFn4|;~vlZZATafOt@}|&Qbx}p@V@?f`4K9!bE3QaKN%H%uxbB@NcX>cDl1u-Twof Ce$SBr diff --git a/internal/wasm/test/provider.wasm b/internal/wasm/test/provider.wasm index 55e4afad4e9ed83bf6443b69b41f2102a2485fb4..31f3ad18029da7ca86a111444eaad9564ce53478 100644 GIT binary patch delta 108398 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 From c02d596b639f183ee3185a47aa20f636a3bde8c4 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Tue, 21 Apr 2026 16:06:37 +0200 Subject: [PATCH 03/22] feat: add project invite management functionality - Introduced ProjectInviteListResponse model for listing project invites. - Added ListProjectInvitesParams for pagination support in listing invites. - Implemented RevokeProjectInvite, ListProjectInvites, AcceptProjectInvite, and GetInviteDetails methods in the Client interface. - Created corresponding request and response parsing functions for project invite operations. - Enhanced AdminsStore with HardDeleteProjectAdmin method for direct deletion of project admins. - Expanded InvitesStore with methods to handle project invites: GetInviteByToken, AcceptProjectInvite, RevokeProjectInvite, and ListProjectInvites. - Updated database migration to enforce unique constraint on invite tokens. --- console/src/api.ts | 23 +- console/src/oapi/management.generated.ts | 172 +++- .../controllers/v1/management/controller.go | 2 + .../http/controllers/v1/management/invites.go | 127 +++ .../v1/management/oapi/resources.yml | 125 +++ .../v1/management/oapi/resources_gen.go | 759 +++++++++++++++++- internal/store/management/admins.go | 10 + internal/store/management/invites.go | 71 ++ .../migrations/1776685923398_migration.up.sql | 2 +- 9 files changed, 1277 insertions(+), 14 deletions(-) diff --git a/console/src/api.ts b/console/src/api.ts index 5bef624b..9d917a60 100644 --- a/console/src/api.ts +++ b/console/src/api.ts @@ -52,6 +52,12 @@ import type { } from "./types" import type { UUID } from "@/types/common" +declare module "axios" { + export interface AxiosRequestConfig { + skipAuthRedirect?: boolean + } +} + function appendValue(params: URLSearchParams, name: string, value: unknown) { if (typeof value === "undefined" || value === null || typeof value === "function") return if (typeof value === "object") value = JSON.stringify(value) @@ -79,7 +85,10 @@ client.interceptors.response.use( (response) => response, async (error) => { const isLoginPage = window.location.pathname.startsWith("/login") - if (error.response.status === 401 && !isLoginPage) { + const isUserNotAuthenticated = error.response?.status === 401 + const skipRedirect = error.config?.skipAuthRedirect + + if (isUserNotAuthenticated && !isLoginPage && !skipRedirect) { api.auth.login() } throw error @@ -180,6 +189,18 @@ const api = { }, }, + invites: { + accept: async (token: string) => { + await client.post( + "/auth/invites/accept", + { token }, + { + skipAuthRedirect: true, // "I'm a big boy, I'll handle this myself" + }, + ) + }, + }, + profile: { get: async () => { if (!cache.profile) { diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index 4f0737bf..9012b70c 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -679,7 +679,11 @@ export interface paths { path?: never; cookie?: never; }; - get?: never; + /** + * List project invites + * @description Retrieves a list of active project invites + */ + get: operations["ListProjectInvites"]; put?: never; /** * Create a project invite @@ -692,6 +696,66 @@ export interface paths { patch?: never; trace?: never; }; + "/api/admin/projects/{projectID}/invites/accept/{token}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + /** + * Accept a project invite + * @description Accepts a project invite using the invite token, associating the authenticated admin with the project + */ + post: operations["AcceptProjectInvite"]; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/admin/project/{projectID}/invites/{token}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + get?: never; + put?: never; + post?: never; + /** + * Revoke a project invite + * @description Revokes a project invite using the invite token, preventing it from being accepted + */ + delete: operations["RevokeProjectInvite"]; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; + "/api/invites/{token}": { + parameters: { + query?: never; + header?: never; + path?: never; + cookie?: never; + }; + /** + * Get invite details + * @description Retrieves the details of a project invite using the invite token, without requiring authentication + */ + get: operations["GetInviteDetails"]; + put?: never; + post?: never; + delete?: never; + options?: never; + head?: never; + patch?: never; + trace?: never; + }; "/api/admin/projects/{projectID}/subjects/users": { parameters: { query?: never; @@ -4739,6 +4803,17 @@ export interface components { }; }; }; + /** @description Project invites retrieved successfully */ + ProjectInviteListResponse: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["PaginatedResponse"] & { + results: components["schemas"]["ProjectInvite"][]; + }; + }; + }; /** @description Journeys retrieved successfully */ JourneyListResponse: { headers: { @@ -6277,6 +6352,27 @@ export interface operations { default: components["responses"]["Error"]; }; }; + ListProjectInvites: { + parameters: { + query?: { + /** @description Maximum number of items to return */ + limit?: components["parameters"]["Limit"]; + /** @description Number of items to skip */ + offset?: components["parameters"]["Offset"]; + }; + header?: never; + path: { + /** @description The project ID */ + projectID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + 200: components["responses"]["ProjectInviteListResponse"]; + default: components["responses"]["Error"]; + }; + }; CreateProjectInvite: { parameters: { query?: never; @@ -6305,6 +6401,80 @@ export interface operations { default: components["responses"]["Error"]; }; }; + AcceptProjectInvite: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project invite token */ + token: string; + /** @description The project ID */ + projectID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project invite accepted successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["Project"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; + RevokeProjectInvite: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project invite token */ + token: string; + /** @description The project ID */ + projectID: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project invite revoked successfully */ + 204: { + headers: { + [name: string]: unknown; + }; + content?: never; + }; + default: components["responses"]["Error"]; + }; + }; + GetInviteDetails: { + parameters: { + query?: never; + header?: never; + path: { + /** @description The project invite token */ + token: string; + }; + cookie?: never; + }; + requestBody?: never; + responses: { + /** @description Project invite details retrieved successfully */ + 200: { + headers: { + [name: string]: unknown; + }; + content: { + "application/json": components["schemas"]["ProjectInvite"]; + }; + }; + default: components["responses"]["Error"]; + }; + }; listUsers: { parameters: { query?: { diff --git a/internal/http/controllers/v1/management/controller.go b/internal/http/controllers/v1/management/controller.go index bbe254e2..86ab4ae5 100644 --- a/internal/http/controllers/v1/management/controller.go +++ b/internal/http/controllers/v1/management/controller.go @@ -46,6 +46,7 @@ func NewController(logger *zap.Logger, managementDB, usersDB, journeyDB *sqlx.DB SenderIdentitiesController: NewSenderIdentitiesController(logger, managementDB, engine), PushProvidersController: NewPushProvidersController(logger, managementDB, registry, engine), BroadcastsController: NewBroadcastsController(logger, managementDB, usersDB, pub, jet, engine, consumer.Namespace(cfg.Nats.Namespace)), + InviteController: NewInviteController(logger, mgmt, engine), } controller.AuthController, err = NewAuthController(logger, managementDB, cfg, engine) @@ -79,4 +80,5 @@ type Controller struct { *SenderIdentitiesController *PushProvidersController *BroadcastsController + *InviteController } diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index feae00f0..50507cee 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -1,14 +1,18 @@ package v1 import ( + "database/sql" "encoding/base64" + "errors" "math/rand" "net/http" "github.com/google/uuid" "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" "github.com/lunogram/platform/internal/http/json" + "github.com/lunogram/platform/internal/http/problem" "github.com/lunogram/platform/internal/rbac" + "github.com/lunogram/platform/internal/store" "github.com/lunogram/platform/internal/store/management" "go.uber.org/zap" ) @@ -54,6 +58,11 @@ func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http. actor := rbac.FromContext(ctx) InviterAdminID := actor.ID + // at 1 billion invite tokens (~200GB of data), the probability of a collision + // is 10^-102%, a decimal point followed by 101 zeroes and a 1. if every atom + // in the observable universe (2^266) was an invite token, it'd still only be + // ~10^-21%. At that point we're also storing 2^266 * 200 bytes of data, which is a number so + // large it doesn't have a name. if this ever fires, forget the bug, go buy a lottery ticket. token := randomString(50) expiresIn := "24h" @@ -73,3 +82,121 @@ func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http. response := invite.OAPI() json.Write(w, http.StatusOK, response) } + +func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Request, token string) { + ctx := r.Context() + + invite, err := srv.mgmt.GetInviteByToken(ctx, token) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + srv.logger.Debug("invite not found", zap.String("token", token)) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) + } else { + srv.logger.Error("failed to get invite details", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + } + return + } + + response := invite.OAPI() + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, token string) { + ctx := r.Context() + actor := rbac.FromContext(ctx) + + invite, err := srv.mgmt.GetInviteByToken(ctx, token) + if err != nil { + srv.logger.Debug("invite not found", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + adminId, err := uuid.Parse(actor.ID) + if err != nil { + srv.logger.Error("invalid admin ID in token", zap.String("admin_id", actor.ID), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + err = srv.mgmt.AddAdminToProject(ctx, projectID, adminId, invite.Role) + if err != nil { + srv.logger.Error("failed to add admin to project", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + //TODO: When the more more relation of the organizations x Admins is implemented, we should also add the user to the organization that the project belongs to. + + invite, err = srv.mgmt.AcceptProjectInvite(ctx, token) + if err != nil { + err = srv.mgmt.HardDeleteProjectAdmin(ctx, projectID, adminId) + if err != nil { + srv.logger.Error("failed to rollback project admin addition after invite acceptance failure", zap.String("project_id", projectID.String()), zap.String("admin_id", adminId.String()), zap.Error(err)) + } + + srv.logger.Error("failed to accept project invite", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + response := invite.OAPI() + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, token string) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Update, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + invite, err := srv.mgmt.RevokeProjectInvite(ctx, token) + if err != nil { + srv.logger.Debug("invite not found or already revoked/accepted", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + response := invite.OAPI() + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, params oapi.ListProjectInvitesParams) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Read, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.Stringer("project_id", projectID)) + logger.Info("listing project invites") + + pagination := store.Pagination{ + Limit: params.Limit.ToInt(), + Offset: params.Offset.ToInt(), + } + + invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination) + if err != nil { + logger.Error("failed to list project invites", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger.Info("listed project invites", zap.Int("count", len(invites))) + response := make([]oapi.ProjectInvite, len(invites)) + for i, invite := range invites { + response[i] = invite.OAPI() + } + + json.Write(w, http.StatusOK, oapi.ProjectInviteListResponse{ + Total: total, + Limit: pagination.Limit, + Offset: pagination.Offset, + Results: response, + }) +} diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index 9fb534fb..4e09fa50 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -1739,6 +1739,115 @@ paths: $ref: "#/components/schemas/ProjectInvite" default: $ref: "#/components/responses/Error" + get: + summary: List project invites + description: Retrieves a list of active project invites + operationId: ListProjectInvites + tags: + - Admins + security: + - HttpBearerAuth: [] + parameters: + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + - $ref: "#/components/parameters/Limit" + - $ref: "#/components/parameters/Offset" + responses: + "200": + $ref: "#/components/responses/ProjectInviteListResponse" + default: + $ref: "#/components/responses/Error" + + /api/admin/projects/{projectID}/invites/accept/{token}: + post: + summary: Accept a project invite + description: Accepts a project invite using the invite token, associating the authenticated admin with the project + operationId: AcceptProjectInvite + tags: + - Admins + security: + - HttpBearerAuth: [] + parameters: + - name: token + in: path + required: true + schema: + type: string + description: The project invite token + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + responses: + "200": + description: Project invite accepted successfully + content: + application/json: + schema: + $ref: "#/components/schemas/Project" + default: + $ref: "#/components/responses/Error" + + /api/admin/project/{projectID}/invites/{token}: + delete: + summary: Revoke a project invite + description: Revokes a project invite using the invite token, preventing it from being accepted + operationId: RevokeProjectInvite + tags: + - Admins + security: + - HttpBearerAuth: [] + parameters: + - name: token + in: path + required: true + schema: + type: string + description: The project invite token + - name: projectID + in: path + required: true + schema: + type: string + format: uuid + description: The project ID + responses: + "204": + description: Project invite revoked successfully + default: + $ref: "#/components/responses/Error" + + /api/invites/{token}: + get: + summary: Get invite details + description: Retrieves the details of a project invite using the invite token, without requiring authentication + operationId: GetInviteDetails + tags: + - Admins + parameters: + - name: token + in: path + required: true + schema: + type: string + description: The project invite token + responses: + "200": + description: Project invite details retrieved successfully + content: + application/json: + schema: + $ref: "#/components/schemas/ProjectInvite" + default: + $ref: "#/components/responses/Error" /api/admin/projects/{projectID}/subjects/users: get: @@ -5411,6 +5520,22 @@ components: items: $ref: "#/components/schemas/Campaign" + ProjectInviteListResponse: + description: Project invites retrieved successfully + content: + application/json: + schema: + allOf: + - $ref: "#/components/schemas/PaginatedResponse" + - type: object + required: + - results + properties: + results: + type: array + items: + $ref: "#/components/schemas/ProjectInvite" + JourneyListResponse: description: Journeys retrieved successfully content: diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 1092f7ff..bce2f624 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -1885,6 +1885,19 @@ type ListListResponse struct { Total int `json:"total"` } +// ProjectInviteListResponse defines model for ProjectInviteListResponse. +type ProjectInviteListResponse struct { + // Limit Maximum number of items returned + Limit int `json:"limit"` + + // Offset Number of items skipped + Offset int `json:"offset"` + Results []ProjectInvite `json:"results"` + + // Total Total number of items matching the filters + Total int `json:"total"` +} + // ProviderListResponse defines model for ProviderListResponse. type ProviderListResponse struct { // Limit Maximum number of items returned @@ -2046,6 +2059,15 @@ type ListEmailTemplatesParams struct { Search *Search `form:"search,omitempty" json:"search,omitempty"` } +// ListProjectInvitesParams defines parameters for ListProjectInvites. +type ListProjectInvitesParams struct { + // Limit Maximum number of items to return + Limit *Limit `form:"limit,omitempty" json:"limit,omitempty"` + + // Offset Number of items to skip + Offset *Offset `form:"offset,omitempty" json:"offset,omitempty"` +} + // ListJourneysParams defines parameters for ListJourneys. type ListJourneysParams struct { // Limit Maximum number of items to return @@ -2545,6 +2567,9 @@ type ClientInterface interface { // GetProfile request GetProfile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) + // RevokeProjectInvite request + RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListProjects request ListProjects(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2708,11 +2733,17 @@ type ClientInterface interface { // ListEmailTemplates request ListEmailTemplates(ctx context.Context, projectID openapi_types.UUID, params *ListEmailTemplatesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListProjectInvites request + ListProjectInvites(ctx context.Context, projectID openapi_types.UUID, params *ListProjectInvitesParams, reqEditors ...RequestEditorFn) (*http.Response, error) + // CreateProjectInviteWithBody request with any body CreateProjectInviteWithBody(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) CreateProjectInvite(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) + // AcceptProjectInvite request + AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListJourneys request ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3109,6 +3140,9 @@ type ClientInterface interface { // AuthWebhook request AuthWebhook(ctx context.Context, driver AuthWebhookParamsDriver, reqEditors ...RequestEditorFn) (*http.Response, error) + + // GetInviteDetails request + GetInviteDetails(ctx context.Context, token string, reqEditors ...RequestEditorFn) (*http.Response, error) } func (c *Client) GetProfile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) { @@ -3123,6 +3157,18 @@ func (c *Client) GetProfile(ctx context.Context, reqEditors ...RequestEditorFn) return c.Client.Do(req) } +func (c *Client) RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRevokeProjectInviteRequest(c.Server, projectID, token) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) ListProjects(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListProjectsRequest(c.Server, params) if err != nil { @@ -3831,6 +3877,18 @@ func (c *Client) ListEmailTemplates(ctx context.Context, projectID openapi_types return c.Client.Do(req) } +func (c *Client) ListProjectInvites(ctx context.Context, projectID openapi_types.UUID, params *ListProjectInvitesParams, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewListProjectInvitesRequest(c.Server, projectID, params) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) CreateProjectInviteWithBody(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewCreateProjectInviteRequestWithBody(c.Server, projectID, contentType, body) if err != nil { @@ -3855,6 +3913,18 @@ func (c *Client) CreateProjectInvite(ctx context.Context, projectID openapi_type return c.Client.Do(req) } +func (c *Client) AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAcceptProjectInviteRequest(c.Server, projectID, token) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListJourneysRequest(c.Server, projectID, params) if err != nil { @@ -5583,6 +5653,18 @@ func (c *Client) AuthWebhook(ctx context.Context, driver AuthWebhookParamsDriver return c.Client.Do(req) } +func (c *Client) GetInviteDetails(ctx context.Context, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewGetInviteDetailsRequest(c.Server, token) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + // NewGetProfileRequest generates requests for GetProfile func NewGetProfileRequest(server string) (*http.Request, error) { var err error @@ -5610,6 +5692,47 @@ func NewGetProfileRequest(server string) (*http.Request, error) { return req, nil } +// NewRevokeProjectInviteRequest generates requests for RevokeProjectInvite +func NewRevokeProjectInviteRequest(server string, projectID openapi_types.UUID, token string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/project/%s/invites/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewListProjectsRequest generates requests for ListProjects func NewListProjectsRequest(server string, params *ListProjectsParams) (*http.Request, error) { var err error @@ -8050,6 +8173,78 @@ func NewListEmailTemplatesRequest(server string, projectID openapi_types.UUID, p return req, nil } +// NewListProjectInvitesRequest generates requests for ListProjectInvites +func NewListProjectInvitesRequest(server string, projectID openapi_types.UUID, params *ListProjectInvitesParams) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/invites", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + if params != nil { + queryValues := queryURL.Query() + + if params.Limit != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Offset != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "offset", runtime.ParamLocationQuery, *params.Offset); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + queryURL.RawQuery = queryValues.Encode() + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewCreateProjectInviteRequest calls the generic CreateProjectInvite builder with application/json body func NewCreateProjectInviteRequest(server string, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody) (*http.Request, error) { var bodyReader io.Reader @@ -8097,6 +8292,47 @@ func NewCreateProjectInviteRequestWithBody(server string, projectID openapi_type return req, nil } +// NewAcceptProjectInviteRequest generates requests for AcceptProjectInvite +func NewAcceptProjectInviteRequest(server string, projectID openapi_types.UUID, token string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/invites/accept/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("POST", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewListJourneysRequest generates requests for ListJourneys func NewListJourneysRequest(server string, projectID openapi_types.UUID, params *ListJourneysParams) (*http.Request, error) { var err error @@ -13839,6 +14075,40 @@ func NewAuthWebhookRequest(server string, driver AuthWebhookParamsDriver) (*http return req, nil } +// NewGetInviteDetailsRequest generates requests for GetInviteDetails +func NewGetInviteDetailsRequest(server string, token string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/invites/%s", pathParam0) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("GET", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + func (c *Client) applyEditors(ctx context.Context, req *http.Request, additionalEditors []RequestEditorFn) error { for _, r := range c.RequestEditors { if err := r(ctx, req); err != nil { @@ -13885,6 +14155,9 @@ type ClientWithResponsesInterface interface { // GetProfileWithResponse request GetProfileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetProfileResponse, error) + // RevokeProjectInviteWithResponse request + RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) + // ListProjectsWithResponse request ListProjectsWithResponse(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*ListProjectsResponse, error) @@ -14048,11 +14321,17 @@ type ClientWithResponsesInterface interface { // ListEmailTemplatesWithResponse request ListEmailTemplatesWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListEmailTemplatesParams, reqEditors ...RequestEditorFn) (*ListEmailTemplatesResponse, error) + // ListProjectInvitesWithResponse request + ListProjectInvitesWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListProjectInvitesParams, reqEditors ...RequestEditorFn) (*ListProjectInvitesResponse, error) + // CreateProjectInviteWithBodyWithResponse request with any body CreateProjectInviteWithBodyWithResponse(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) CreateProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) + // AcceptProjectInviteWithResponse request + AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) + // ListJourneysWithResponse request ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) @@ -14449,6 +14728,9 @@ type ClientWithResponsesInterface interface { // AuthWebhookWithResponse request AuthWebhookWithResponse(ctx context.Context, driver AuthWebhookParamsDriver, reqEditors ...RequestEditorFn) (*AuthWebhookResponse, error) + + // GetInviteDetailsWithResponse request + GetInviteDetailsWithResponse(ctx context.Context, token string, reqEditors ...RequestEditorFn) (*GetInviteDetailsResponse, error) } type GetProfileResponse struct { @@ -14474,6 +14756,28 @@ func (r GetProfileResponse) StatusCode() int { return 0 } +type RevokeProjectInviteResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r RevokeProjectInviteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r RevokeProjectInviteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ListProjectsResponse struct { Body []byte HTTPResponse *http.Response @@ -15524,6 +15828,29 @@ func (r ListEmailTemplatesResponse) StatusCode() int { return 0 } +type ListProjectInvitesResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ProjectInviteListResponse + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r ListProjectInvitesResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r ListProjectInvitesResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type CreateProjectInviteResponse struct { Body []byte HTTPResponse *http.Response @@ -15547,6 +15874,29 @@ func (r CreateProjectInviteResponse) StatusCode() int { return 0 } +type AcceptProjectInviteResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *Project + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r AcceptProjectInviteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r AcceptProjectInviteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ListJourneysResponse struct { Body []byte HTTPResponse *http.Response @@ -18059,6 +18409,29 @@ func (r AuthWebhookResponse) StatusCode() int { return 0 } +type GetInviteDetailsResponse struct { + Body []byte + HTTPResponse *http.Response + JSON200 *ProjectInvite + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r GetInviteDetailsResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r GetInviteDetailsResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + // GetProfileWithResponse request returning *GetProfileResponse func (c *ClientWithResponses) GetProfileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetProfileResponse, error) { rsp, err := c.GetProfile(ctx, reqEditors...) @@ -18068,6 +18441,15 @@ func (c *ClientWithResponses) GetProfileWithResponse(ctx context.Context, reqEdi return ParseGetProfileResponse(rsp) } +// RevokeProjectInviteWithResponse request returning *RevokeProjectInviteResponse +func (c *ClientWithResponses) RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) { + rsp, err := c.RevokeProjectInvite(ctx, projectID, token, reqEditors...) + if err != nil { + return nil, err + } + return ParseRevokeProjectInviteResponse(rsp) +} + // ListProjectsWithResponse request returning *ListProjectsResponse func (c *ClientWithResponses) ListProjectsWithResponse(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*ListProjectsResponse, error) { rsp, err := c.ListProjects(ctx, params, reqEditors...) @@ -18585,6 +18967,15 @@ func (c *ClientWithResponses) ListEmailTemplatesWithResponse(ctx context.Context return ParseListEmailTemplatesResponse(rsp) } +// ListProjectInvitesWithResponse request returning *ListProjectInvitesResponse +func (c *ClientWithResponses) ListProjectInvitesWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListProjectInvitesParams, reqEditors ...RequestEditorFn) (*ListProjectInvitesResponse, error) { + rsp, err := c.ListProjectInvites(ctx, projectID, params, reqEditors...) + if err != nil { + return nil, err + } + return ParseListProjectInvitesResponse(rsp) +} + // CreateProjectInviteWithBodyWithResponse request with arbitrary body returning *CreateProjectInviteResponse func (c *ClientWithResponses) CreateProjectInviteWithBodyWithResponse(ctx context.Context, projectID openapi_types.UUID, contentType string, body io.Reader, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) { rsp, err := c.CreateProjectInviteWithBody(ctx, projectID, contentType, body, reqEditors...) @@ -18602,6 +18993,15 @@ func (c *ClientWithResponses) CreateProjectInviteWithResponse(ctx context.Contex return ParseCreateProjectInviteResponse(rsp) } +// AcceptProjectInviteWithResponse request returning *AcceptProjectInviteResponse +func (c *ClientWithResponses) AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) { + rsp, err := c.AcceptProjectInvite(ctx, projectID, token, reqEditors...) + if err != nil { + return nil, err + } + return ParseAcceptProjectInviteResponse(rsp) +} + // ListJourneysWithResponse request returning *ListJourneysResponse func (c *ClientWithResponses) ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) { rsp, err := c.ListJourneys(ctx, projectID, params, reqEditors...) @@ -19860,30 +20260,65 @@ func (c *ClientWithResponses) AuthWebhookWithResponse(ctx context.Context, drive if err != nil { return nil, err } - return ParseAuthWebhookResponse(rsp) + return ParseAuthWebhookResponse(rsp) +} + +// GetInviteDetailsWithResponse request returning *GetInviteDetailsResponse +func (c *ClientWithResponses) GetInviteDetailsWithResponse(ctx context.Context, token string, reqEditors ...RequestEditorFn) (*GetInviteDetailsResponse, error) { + rsp, err := c.GetInviteDetails(ctx, token, reqEditors...) + if err != nil { + return nil, err + } + return ParseGetInviteDetailsResponse(rsp) +} + +// ParseGetProfileResponse parses an HTTP response from a GetProfileWithResponse call +func ParseGetProfileResponse(rsp *http.Response) (*GetProfileResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetProfileResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest Admin + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil } -// ParseGetProfileResponse parses an HTTP response from a GetProfileWithResponse call -func ParseGetProfileResponse(rsp *http.Response) (*GetProfileResponse, error) { +// ParseRevokeProjectInviteResponse parses an HTTP response from a RevokeProjectInviteWithResponse call +func ParseRevokeProjectInviteResponse(rsp *http.Response) (*RevokeProjectInviteResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) defer func() { _ = rsp.Body.Close() }() if err != nil { return nil, err } - response := &GetProfileResponse{ + response := &RevokeProjectInviteResponse{ Body: bodyBytes, HTTPResponse: rsp, } switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: - var dest Admin - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSON200 = &dest - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: var dest Error if err := json.Unmarshal(bodyBytes, &dest); err != nil { @@ -21336,6 +21771,39 @@ func ParseListEmailTemplatesResponse(rsp *http.Response) (*ListEmailTemplatesRes return response, nil } +// ParseListProjectInvitesResponse parses an HTTP response from a ListProjectInvitesWithResponse call +func ParseListProjectInvitesResponse(rsp *http.Response) (*ListProjectInvitesResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &ListProjectInvitesResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ProjectInviteListResponse + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseCreateProjectInviteResponse parses an HTTP response from a CreateProjectInviteWithResponse call func ParseCreateProjectInviteResponse(rsp *http.Response) (*CreateProjectInviteResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -21369,6 +21837,39 @@ func ParseCreateProjectInviteResponse(rsp *http.Response) (*CreateProjectInviteR return response, nil } +// ParseAcceptProjectInviteResponse parses an HTTP response from a AcceptProjectInviteWithResponse call +func ParseAcceptProjectInviteResponse(rsp *http.Response) (*AcceptProjectInviteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &AcceptProjectInviteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest Project + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseListJourneysResponse parses an HTTP response from a ListJourneysWithResponse call func ParseListJourneysResponse(rsp *http.Response) (*ListJourneysResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -24779,11 +25280,47 @@ func ParseAuthWebhookResponse(rsp *http.Response) (*AuthWebhookResponse, error) return response, nil } +// ParseGetInviteDetailsResponse parses an HTTP response from a GetInviteDetailsWithResponse call +func ParseGetInviteDetailsResponse(rsp *http.Response) (*GetInviteDetailsResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &GetInviteDetailsResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && rsp.StatusCode == 200: + var dest ProjectInvite + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSON200 = &dest + + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ServerInterface represents all server handlers. type ServerInterface interface { // Get current admin profile // (GET /api/admin/profile) GetProfile(w http.ResponseWriter, r *http.Request) + // Revoke a project invite + // (DELETE /api/admin/project/{projectID}/invites/{token}) + RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) // List projects // (GET /api/admin/projects) ListProjects(w http.ResponseWriter, r *http.Request, params ListProjectsParams) @@ -24919,9 +25456,15 @@ type ServerInterface interface { // List email starter templates // (GET /api/admin/projects/{projectID}/email/templates) ListEmailTemplates(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListEmailTemplatesParams) + // List project invites + // (GET /api/admin/projects/{projectID}/invites) + ListProjectInvites(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListProjectInvitesParams) // Create a project invite // (POST /api/admin/projects/{projectID}/invites) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID) + // Accept a project invite + // (POST /api/admin/projects/{projectID}/invites/accept/{token}) + AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) // List journeys // (GET /api/admin/projects/{projectID}/journeys) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) @@ -25249,6 +25792,9 @@ type ServerInterface interface { // Auth provider webhook // (POST /api/auth/{driver}/webhook) AuthWebhook(w http.ResponseWriter, r *http.Request, driver AuthWebhookParamsDriver) + // Get invite details + // (GET /api/invites/{token}) + GetInviteDetails(w http.ResponseWriter, r *http.Request, token string) } // Unimplemented server implementation that returns http.StatusNotImplemented for each endpoint. @@ -25261,6 +25807,12 @@ func (_ Unimplemented) GetProfile(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) } +// Revoke a project invite +// (DELETE /api/admin/project/{projectID}/invites/{token}) +func (_ Unimplemented) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) { + w.WriteHeader(http.StatusNotImplemented) +} + // List projects // (GET /api/admin/projects) func (_ Unimplemented) ListProjects(w http.ResponseWriter, r *http.Request, params ListProjectsParams) { @@ -25531,12 +26083,24 @@ func (_ Unimplemented) ListEmailTemplates(w http.ResponseWriter, r *http.Request w.WriteHeader(http.StatusNotImplemented) } +// List project invites +// (GET /api/admin/projects/{projectID}/invites) +func (_ Unimplemented) ListProjectInvites(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListProjectInvitesParams) { + w.WriteHeader(http.StatusNotImplemented) +} + // Create a project invite // (POST /api/admin/projects/{projectID}/invites) func (_ Unimplemented) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID) { w.WriteHeader(http.StatusNotImplemented) } +// Accept a project invite +// (POST /api/admin/projects/{projectID}/invites/accept/{token}) +func (_ Unimplemented) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) { + w.WriteHeader(http.StatusNotImplemented) +} + // List journeys // (GET /api/admin/projects/{projectID}/journeys) func (_ Unimplemented) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) { @@ -26191,6 +26755,12 @@ func (_ Unimplemented) AuthWebhook(w http.ResponseWriter, r *http.Request, drive w.WriteHeader(http.StatusNotImplemented) } +// Get invite details +// (GET /api/invites/{token}) +func (_ Unimplemented) GetInviteDetails(w http.ResponseWriter, r *http.Request, token string) { + w.WriteHeader(http.StatusNotImplemented) +} + // ServerInterfaceWrapper converts contexts to parameters. type ServerInterfaceWrapper struct { Handler ServerInterface @@ -26220,6 +26790,46 @@ func (siw *ServerInterfaceWrapper) GetProfile(w http.ResponseWriter, r *http.Req handler.ServeHTTP(w, r) } +// RevokeProjectInvite operation middleware +func (siw *ServerInterfaceWrapper) RevokeProjectInvite(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "token" ------------- + var token string + + err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.RevokeProjectInvite(w, r, projectID, token) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListProjects operation middleware func (siw *ServerInterfaceWrapper) ListProjects(w http.ResponseWriter, r *http.Request) { @@ -28152,6 +28762,56 @@ func (siw *ServerInterfaceWrapper) ListEmailTemplates(w http.ResponseWriter, r * handler.ServeHTTP(w, r) } +// ListProjectInvites operation middleware +func (siw *ServerInterfaceWrapper) ListProjectInvites(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + // Parameter object where we will unmarshal all parameters from the context + var params ListProjectInvitesParams + + // ------------- Optional query parameter "limit" ------------- + + err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "limit", Err: err}) + return + } + + // ------------- Optional query parameter "offset" ------------- + + err = runtime.BindQueryParameter("form", true, false, "offset", r.URL.Query(), ¶ms.Offset) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "offset", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.ListProjectInvites(w, r, projectID, params) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // CreateProjectInvite operation middleware func (siw *ServerInterfaceWrapper) CreateProjectInvite(w http.ResponseWriter, r *http.Request) { @@ -28183,6 +28843,46 @@ func (siw *ServerInterfaceWrapper) CreateProjectInvite(w http.ResponseWriter, r handler.ServeHTTP(w, r) } +// AcceptProjectInvite operation middleware +func (siw *ServerInterfaceWrapper) AcceptProjectInvite(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "token" ------------- + var token string + + err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.AcceptProjectInvite(w, r, projectID, token) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListJourneys operation middleware func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.Request) { @@ -32783,6 +33483,31 @@ func (siw *ServerInterfaceWrapper) AuthWebhook(w http.ResponseWriter, r *http.Re handler.ServeHTTP(w, r) } +// GetInviteDetails operation middleware +func (siw *ServerInterfaceWrapper) GetInviteDetails(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "token" ------------- + var token string + + err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) + return + } + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.GetInviteDetails(w, r, token) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + type UnescapedCookieParamError struct { ParamName string Err error @@ -32899,6 +33624,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/profile", wrapper.GetProfile) }) + r.Group(func(r chi.Router) { + r.Delete(options.BaseURL+"/api/admin/project/{projectID}/invites/{token}", wrapper.RevokeProjectInvite) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects", wrapper.ListProjects) }) @@ -33034,9 +33762,15 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/email/templates", wrapper.ListEmailTemplates) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/admin/projects/{projectID}/invites", wrapper.ListProjectInvites) + }) r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites", wrapper.CreateProjectInvite) }) + r.Group(func(r chi.Router) { + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites/accept/{token}", wrapper.AcceptProjectInvite) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys", wrapper.ListJourneys) }) @@ -33364,6 +34098,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/auth/{driver}/webhook", wrapper.AuthWebhook) }) + r.Group(func(r chi.Router) { + r.Get(options.BaseURL+"/api/invites/{token}", wrapper.GetInviteDetails) + }) return r } diff --git a/internal/store/management/admins.go b/internal/store/management/admins.go index 98c3bf73..b8edc574 100644 --- a/internal/store/management/admins.go +++ b/internal/store/management/admins.go @@ -369,3 +369,13 @@ func (s *AdminsStore) DeleteProjectAdmin(ctx context.Context, projectID, adminID _, err := s.db.ExecContext(ctx, query, projectID, adminID) return err } + +func (s *AdminsStore) HardDeleteProjectAdmin(ctx context.Context, projectID, adminID uuid.UUID) error { + query := ` + DELETE FROM project_admins + WHERE project_id = $1 + AND admin_id = $2` + + _, err := s.db.ExecContext(ctx, query, projectID, adminID) + return err +} diff --git a/internal/store/management/invites.go b/internal/store/management/invites.go index 3237da58..c13693ad 100644 --- a/internal/store/management/invites.go +++ b/internal/store/management/invites.go @@ -61,3 +61,74 @@ func (s *InvitesStore) CreateProjectInvite(ctx context.Context, projectID uuid.U } return &invite, nil } + +func (s *InvitesStore) GetInviteByToken(ctx context.Context, token string) (*Invite, error) { + stmt := ` + SELECT id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at + FROM invites + WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW()` + + var invite Invite + err := s.db.GetContext(ctx, &invite, stmt, token) + if err != nil { + return nil, err + } + return &invite, nil +} + +func (s *InvitesStore) AcceptProjectInvite(ctx context.Context, token string) (*Invite, error) { + stmt := ` + UPDATE invites + SET accepted_at = NOW() + WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() + RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` + + var invite Invite + err := s.db.GetContext(ctx, &invite, stmt, token) + if err != nil { + return nil, err + } + return &invite, nil +} + +func (s *InvitesStore) RevokeProjectInvite(ctx context.Context, token string) (*Invite, error) { + stmt := ` + UPDATE invites + SET revoked_at = NOW() + WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() + RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` + + var invite Invite + err := s.db.GetContext(ctx, &invite, stmt, token) + if err != nil { + return nil, err + } + return &invite, nil +} + +func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UUID, pagination store.Pagination) ([]Invite, int, error) { + countStmt := ` + SELECT COUNT(*) + FROM invites + WHERE project_id = $1 AND revoked_at IS NULL AND accepted_at IS NULL` + + var total int + err := s.db.GetContext(ctx, &total, countStmt, projectID) + if err != nil { + return nil, 0, err + } + + stmt := ` + SELECT id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at + FROM invites + WHERE project_id = $1 AND revoked_at IS NULL AND accepted_at IS NULL + ORDER BY created_at DESC + LIMIT $2 OFFSET $3` + + var invites []Invite + err = s.db.SelectContext(ctx, &invites, stmt, projectID, pagination.Limit, pagination.Offset) + if err != nil { + return nil, 0, err + } + return invites, total, nil +} diff --git a/internal/store/management/migrations/1776685923398_migration.up.sql b/internal/store/management/migrations/1776685923398_migration.up.sql index eec6d9be..f58d4393 100644 --- a/internal/store/management/migrations/1776685923398_migration.up.sql +++ b/internal/store/management/migrations/1776685923398_migration.up.sql @@ -3,7 +3,7 @@ CREATE TABLE project_invites ( project_id UUID REFERENCES projects(id) ON DELETE CASCADE, inviter_admin_id UUID NOT NULL REFERENCES admins(id) ON DELETE SET NULL, invitee_email VARCHAR(255) NOT NULL, - token VARCHAR(50) NOT NULL, + token VARCHAR(50) NOT NULL UNIQUE, role VARCHAR(50) NOT NULL, CHECK (role IN ('support', 'client', 'editor', 'admin')), From 93c6e9c86b5802125cba3898fa66f695c271019e Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Wed, 22 Apr 2026 15:07:48 +0200 Subject: [PATCH 04/22] feat: add project invite management features - Added a new "Invites" section in the settings menu with a UserPlus icon. - Enhanced user search functionality in the ListDetail component. - Updated OrganizationEventRuleEdit to improve accessibility with better aria-labels. - Modified the InviteController to support filtering project invites by status, role, and expiration dates. - Updated OpenAPI resources to include new query parameters for invite management. - Refactored invite handling in the management store to support new filtering options. - Changed database table references from "invites" to "project_invites" for clarity. - Implemented revoke project invite functionality with proper middleware handling. --- console/public/locales/en.json | 13 + console/public/locales/es.json | 13 + console/public/locales/zh.json | 13 + console/src/api.ts | 26 + console/src/oapi/management.generated.ts | 26 +- console/src/types.ts | 12 + .../src/views/campaign/CampaignDetails.tsx | 16 +- console/src/views/campaign/CreateCampaign.tsx | 4 +- .../views/journey/editor/JourneyEditor.tsx | 9 +- .../OrganizationDetailMembers.tsx | 5 +- .../src/views/organizations/Organizations.tsx | 5 +- console/src/views/router.tsx | 5 + console/src/views/settings/ApiKeys.tsx | 2 +- console/src/views/settings/InviteDialog.tsx | 246 +++++++++ console/src/views/settings/Invites.tsx | 499 ++++++++++++++++++ console/src/views/settings/Settings.tsx | 2 + console/src/views/users/ListDetail.tsx | 12 +- .../users/rules/OrganizationEventRuleEdit.tsx | 5 +- .../http/controllers/v1/management/invites.go | 5 +- .../v1/management/oapi/resources.yml | 44 +- .../v1/management/oapi/resources_gen.go | 487 +++++++++++------ internal/store/management/invites.go | 63 ++- 22 files changed, 1293 insertions(+), 219 deletions(-) create mode 100644 console/src/views/settings/InviteDialog.tsx create mode 100644 console/src/views/settings/Invites.tsx diff --git a/console/public/locales/en.json b/console/public/locales/en.json index 2b5081d3..f9ad0d9e 100644 --- a/console/public/locales/en.json +++ b/console/public/locales/en.json @@ -463,6 +463,19 @@ "invalid_email": "Invalid Email", "invalid_json": "Invalid JSON syntax", "invite_to_project": "Invite to Project", + "invites": "Invites", + "create_invite": "Create Invite", + "create_invite_description": "Invite a team member to your project.", + "revoke_invite_confirmation": "Are you sure you want to revoke this invite?", + "invite_revoked": "Invite revoked", + "copied_invite_link": "Copied invite link", + "invite_permission_denied": "You need admin or owner role to create invites.", + "no_invites_yet": "No invites yet", + "copy_link": "Copy Link", + "revoke": "Revoke", + "invite_created": "Invite created", + "expires": "Expires", + "expires_in": "Expires in", "joined_list_at": "Joined List At", "onboarding_integration_title": "Set up an Integration", "onboarding_integration_description": "Connect a provider to start sending messages. You can always add more later.", diff --git a/console/public/locales/es.json b/console/public/locales/es.json index b26fa90e..5537e932 100644 --- a/console/public/locales/es.json +++ b/console/public/locales/es.json @@ -218,6 +218,19 @@ "in_timezone": "En zona horaria", "integrations": "Integraciones", "invite_to_project": "Invitar al Proyecto", + "invites": "Invitaciones", + "create_invite": "Crear invitación", + "create_invite_description": "Invita a un miembro del equipo a tu proyecto.", + "revoke_invite_confirmation": "¿Estás seguro de que quieres revocar esta invitación?", + "invite_revoked": "Invitación revocada", + "copied_invite_link": "Enlace de invitación copiado", + "invite_permission_denied": "Necesitas rol de administrador o propietario para crear invitaciones.", + "no_invites_yet": "No hay invitaciones todavía", + "copy_link": "Copiar enlace", + "revoke": "Revocar", + "invite_created": "Invitación creada", + "expires": "Expira", + "expires_in": "Expira en", "joined_list_at": "Añadido a La Lista En", "journey": "Camino", "journey_saved": "¡Camino Salvado!", diff --git a/console/public/locales/zh.json b/console/public/locales/zh.json index 0a38a01f..200ae047 100644 --- a/console/public/locales/zh.json +++ b/console/public/locales/zh.json @@ -214,6 +214,19 @@ "in_timezone": "在时区", "integrations": "集成", "invite_to_project": "邀请加入项目", + "invites": "邀请", + "create_invite": "创建邀请", + "create_invite_description": "邀请团队成员加入您的项目。", + "revoke_invite_confirmation": "确定要撤销此邀请吗?", + "invite_revoked": "邀请已撤销", + "copied_invite_link": "邀请链接已复制", + "invite_permission_denied": "您需要管理员或所有者角色才能创建邀请。", + "no_invites_yet": "暂无邀请", + "copy_link": "复制链接", + "revoke": "撤销", + "invite_created": "邀请已创建", + "expires": "过期时间", + "expires_in": "有效期", "joined_list_at": "加入列表时间", "journey": "旅程", "journey_saved": "旅程已保存!", diff --git a/console/src/api.ts b/console/src/api.ts index 9d917a60..ef7dac71 100644 --- a/console/src/api.ts +++ b/console/src/api.ts @@ -27,6 +27,8 @@ import type { ProjectAdminParams, ProjectApiKey, ProjectApiKeyParams, + ProjectInvite, + ProjectRole, Resource, RulePath, SearchParams, @@ -199,6 +201,30 @@ const api = { }, ) }, + list: async ( + projectId: UUID, + params?: { + limit?: number + offset?: number + search?: string + status?: string + role?: string + expires_after?: string + expires_before?: string + }, + ) => + await client + .get>(`${projectUrl(projectId)}/invites`, { params }) + .then((r) => r.data), + create: async ( + projectId: UUID, + params: { email: string; role: ProjectRole; expires_in?: string }, + ) => + await client + .post(`${projectUrl(projectId)}/invites`, params) + .then((r) => r.data), + revoke: async (projectId: UUID, token: string) => + await client.delete(`${projectUrl(projectId)}/invites/${token}`).then((r) => r.data), }, profile: { diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index 9012b70c..3700de6b 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -716,7 +716,7 @@ export interface paths { patch?: never; trace?: never; }; - "/api/admin/project/{projectID}/invites/{token}": { + "/api/admin/projects/{projectID}/invites/{token}": { parameters: { query?: never; header?: never; @@ -6355,6 +6355,13 @@ export interface operations { ListProjectInvites: { parameters: { query?: { + /** @description Filter invites by status */ + status?: "pending" | "accepted" | "revoked" | "expired"; + role?: "support" | "client" | "editor" | "admin"; + expires_after?: string; + expires_before?: string; + /** @description Search query string */ + search?: components["parameters"]["Search"]; /** @description Maximum number of items to return */ limit?: components["parameters"]["Limit"]; /** @description Number of items to skip */ @@ -6406,7 +6413,10 @@ export interface operations { query?: never; header?: never; path: { - /** @description The project invite token */ + /** + * @description The project invite token + * @example abc123def456 + */ token: string; /** @description The project ID */ projectID: string; @@ -6432,10 +6442,13 @@ export interface operations { query?: never; header?: never; path: { - /** @description The project invite token */ - token: string; /** @description The project ID */ projectID: string; + /** + * @description The project invite token + * @example abc123def456 + */ + token: string; }; cookie?: never; }; @@ -6456,7 +6469,10 @@ export interface operations { query?: never; header?: never; path: { - /** @description The project invite token */ + /** + * @description The project invite token + * @example abc123def456 + */ token: string; }; cookie?: never; diff --git a/console/src/types.ts b/console/src/types.ts index 18d46352..ee82d81c 100644 --- a/console/src/types.ts +++ b/console/src/types.ts @@ -332,6 +332,18 @@ export interface Admin { export const projectRoles = ["support", "client", "editor", "admin"] as const +export interface ProjectInvite { + id: UUID + project_id: UUID + inviter_admin_id: UUID + invitee_email: string + role: ProjectRole + token: string + expires_at: string + accepted_at: string | null + revoked_at: string | null +} + export type ProjectRole = (typeof projectRoles)[number] export interface ProjectAdmin extends Omit { diff --git a/console/src/views/campaign/CampaignDetails.tsx b/console/src/views/campaign/CampaignDetails.tsx index de3e7dcb..7cd6b4e8 100644 --- a/console/src/views/campaign/CampaignDetails.tsx +++ b/console/src/views/campaign/CampaignDetails.tsx @@ -187,7 +187,10 @@ function CampaignReview({ campaign, template }: { campaign: Campaign; template: {t("campaign.subscription", "Subscription")} - - {isEnterprise && ( - diff --git a/console/src/views/campaign/CreateCampaign.tsx b/console/src/views/campaign/CreateCampaign.tsx index e002bd1c..4476ba5a 100644 --- a/console/src/views/campaign/CreateCampaign.tsx +++ b/console/src/views/campaign/CreateCampaign.tsx @@ -136,7 +136,9 @@ export function CreateCampaign({ open = false, onBeforeCreate, trigger }: Create data: {}, }) - navigate(`/projects/${project.id}/campaigns/${campaign.data.id}/templates/${template.id}`) + navigate( + `/projects/${project.id}/campaigns/${campaign.data.id}/templates/${template.id}`, + ) } } diff --git a/console/src/views/journey/editor/JourneyEditor.tsx b/console/src/views/journey/editor/JourneyEditor.tsx index c814b830..81dff60a 100644 --- a/console/src/views/journey/editor/JourneyEditor.tsx +++ b/console/src/views/journey/editor/JourneyEditor.tsx @@ -327,14 +327,7 @@ export default function JourneyEditor() { setStepsLoaded(true) } void load() - }, [ - project.id, - journey.id, - setNodes, - setEdges, - stepsLoaded, - nodeActions, - ]) + }, [project.id, journey.id, setNodes, setEdges, stepsLoaded, nodeActions]) const onPaneClick = useCallback(() => { if (editNode) setNodes(nodes.map((n) => ({ ...n, data: { ...n.data, editing: false } }))) diff --git a/console/src/views/organizations/OrganizationDetailMembers.tsx b/console/src/views/organizations/OrganizationDetailMembers.tsx index d0141618..9c1f0e84 100644 --- a/console/src/views/organizations/OrganizationDetailMembers.tsx +++ b/console/src/views/organizations/OrganizationDetailMembers.tsx @@ -372,7 +372,10 @@ export default function OrganizationDetailMembers() { size="sm" onClick={() => setIsAddMemberOpen(true)} className="mt-4" - aria-label={t("add_member_from_empty_state", "Add member from empty state")} + aria-label={t( + "add_member_from_empty_state", + "Add member from empty state", + )} > {t("add_member")} diff --git a/console/src/views/organizations/Organizations.tsx b/console/src/views/organizations/Organizations.tsx index 6e1ff8b0..c5a63876 100644 --- a/console/src/views/organizations/Organizations.tsx +++ b/console/src/views/organizations/Organizations.tsx @@ -156,7 +156,10 @@ export default function Organizations() { + ) + })} + + +
+

+ {snakeToTitle(selectedRole)} {t("permissions", "permissions")} +

+
    + {roleConfig[selectedRole as ProjectRole]?.permissions.map( + (perm) => ( +
  • + + {perm} +
  • + ), + )} +
+
+ + + + + + + + + + ) +} diff --git a/console/src/views/settings/Invites.tsx b/console/src/views/settings/Invites.tsx new file mode 100644 index 00000000..4027e434 --- /dev/null +++ b/console/src/views/settings/Invites.tsx @@ -0,0 +1,499 @@ +import { useCallback, useContext, useState, useRef } from "react" +import { useTranslation } from "react-i18next" +import { + Plus, + Search, + UserPlus, + MoreHorizontal, + Copy, + Mail, + Clock, + CheckCircle, + XCircle, + ClockFading, + ChevronLeft, + ChevronRight, + SlidersHorizontal, + X, +} from "lucide-react" +import { toast } from "sonner" +import api from "@/api" +import { ProjectContext } from "@/contexts" +import { useResolver } from "@/hooks" +import { snakeToTitle } from "@/utils" +import { projectRoles, type ProjectInvite, type ProjectRole } from "@/types" +import InviteDialog from "./InviteDialog" + +import { Button } from "@/components/ui/button" +import { Input } from "@/components/ui/input" +import { Label } from "@/components/ui/label" +import { + Table, + TableBody, + TableCell, + TableHead, + TableHeader, + TableRow, +} from "@/components/ui/table" +import { Skeleton } from "@/components/ui/skeleton" +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu" +import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" + +export default function Invites() { + const { t } = useTranslation() + const [project] = useContext(ProjectContext) + + const [searchQuery, setSearchQuery] = useState("") + const [debouncedQuery, setDebouncedQuery] = useState("") + const [statusFilter, setStatusFilter] = useState(undefined) + const [roleFilter, setRoleFilter] = useState(undefined) + const [expiresAfter, setExpiresAfter] = useState("") + const [expiresBefore, setExpiresBefore] = useState("") + const [page, setPage] = useState(1) + const limit = 15 + const searchTimeoutRef = useRef>(setTimeout(() => {}, 0)) + const [isCreating, setIsCreating] = useState(false) + const [isSaving, setIsSaving] = useState(false) + + const handleSearch = useCallback((value: string) => { + setSearchQuery(value) + setPage(1) + clearTimeout(searchTimeoutRef.current) + searchTimeoutRef.current = setTimeout(() => { + setDebouncedQuery(value) + }, 300) + }, []) + + const handleStatusFilterChange = useCallback((value: string) => { + setStatusFilter(value === "all" ? undefined : value) + setPage(1) + }, []) + + const handleRoleFilterChange = useCallback((value: string) => { + setRoleFilter(value === "all" ? undefined : (value as ProjectRole)) + setPage(1) + }, []) + + const handleExpiresAfterChange = useCallback((value: string) => { + setExpiresAfter(value) + setPage(1) + }, []) + + const handleExpiresBeforeChange = useCallback((value: string) => { + setExpiresBefore(value) + setPage(1) + }, []) + + const clearFilters = useCallback(() => { + setStatusFilter(undefined) + setRoleFilter(undefined) + setExpiresAfter("") + setExpiresBefore("") + setPage(1) + }, []) + + const hasActiveFilters = statusFilter || roleFilter || expiresAfter || expiresBefore + + const [result, , reload] = useResolver( + useCallback(async () => { + return await api.invites.list(project.id, { + limit, + offset: (page - 1) * limit, + search: debouncedQuery || undefined, + status: statusFilter, + role: roleFilter, + expires_after: expiresAfter || undefined, + expires_before: expiresBefore || undefined, + }) + }, [ + project.id, + debouncedQuery, + statusFilter, + roleFilter, + expiresAfter, + expiresBefore, + page, + ]), + ) + + const invites = result?.results ?? [] + const total = result?.total ?? 0 + const totalPages = Math.ceil(total / limit) + const hasNextPage = page < totalPages + const hasPrevPage = page > 1 + + const handleRevoke = async (token: string) => { + if ( + confirm(t("revoke_invite_confirmation", "Are you sure you want to revoke this invite?")) + ) { + await api.invites.revoke(project.id, token) + toast.success(t("invite_revoked", "Invite revoked")) + await reload() + } + } + + const handleCopyLink = async (token: string) => { + const inviteLink = `${window.location.origin}/invites/${token}` + await navigator.clipboard.writeText(inviteLink) + toast.success(t("copied_invite_link", "Copied invite link")) + } + + const formatDate = (dateStr: string | null | undefined) => { + if (!dateStr) return "—" + return new Date(dateStr).toLocaleDateString(undefined, { + year: "numeric", + month: "short", + day: "numeric", + hour: "2-digit", + minute: "2-digit", + }) + } + + const getInviteStatus = (invite: ProjectInvite) => { + if (invite.revoked_at) { + return { status: "revoked", icon: XCircle, className: "text-red-500" } + } + if (invite.accepted_at) { + return { status: "accepted", icon: CheckCircle, className: "text-green-500" } + } + if (new Date(invite.expires_at) < new Date()) { + return { status: "expired", icon: ClockFading, className: "text-muted-foreground" } + } + return { status: "pending", icon: Clock, className: "text-blue-500" } + } + + const canCreateInvite = project.role === "admin" + + return ( +
+
+

{t("invites")}

+
+ +
+
+
+ + handleSearch(e.target.value)} + className="pl-9" + /> +
+ + + + + +
+
+ +
+ {["all", "pending", "accepted", "expired", "revoked"].map( + (status) => ( + + ), + )} +
+
+
+ +
+ {["all", ...projectRoles].map((role) => ( + + ))} +
+
+
+ +
+ + handleExpiresAfterChange(e.target.value) + } + className="h-8 text-xs" + placeholder={t("after", "After")} + /> + - + + handleExpiresBeforeChange(e.target.value) + } + className="h-8 text-xs" + placeholder={t("before", "Before")} + /> +
+
+ {hasActiveFilters && ( + + )} +
+
+
+
+ +
+ + {!canCreateInvite && ( +

+ {t("invite_permission_denied", "You need admin role to create invites.")} +

+ )} + +
+ + + + {t("email")} + {t("role")} + {t("expires")} + {t("status")} + + + + + {!result ? ( + Array.from({ length: 3 }).map((_, i) => ( + + + + + + + + + + + + + + + + + + )) + ) : invites.length === 0 ? ( + + +
+ +

+ {debouncedQuery + ? t("no_results") + : t("no_invites_yet", "No invites yet")} +

+ {!debouncedQuery && canCreateInvite && ( + + )} +
+
+
+ ) : ( + invites.map((invite) => { + const { + status, + icon: StatusIcon, + className: statusClassName, + } = getInviteStatus(invite) + return ( + + +
+ + + {invite.invitee_email} + +
+
+ + {snakeToTitle(invite.role)} + + + {formatDate(invite.expires_at)} + + +
+ + {status} +
+
+ + + + + + + { + e.stopPropagation() + await handleCopyLink(invite.token) + }} + > + + {t("copy_link")} + + {!invite.revoked_at && + !invite.accepted_at && + canCreateInvite && ( + { + e.stopPropagation() + await handleRevoke(invite.token) + }} + > + + {t("revoke")} + + )} + + + +
+ ) + }) + )} +
+
+ + {total > 0 && ( +
+

+ {total} {total === 1 ? t("invite", "invite") : t("invites")} +

+ {totalPages > 1 && ( +
+ + + {page} / {totalPages} + + +
+ )} +
+ )} +
+ + setIsCreating(false)} + onSave={async (data) => { + setIsSaving(true) + try { + await api.invites.create(project.id, data) + toast.success(t("invite_created", "Invite created")) + await reload() + setIsCreating(false) + } finally { + setIsSaving(false) + } + }} + isSaving={isSaving} + /> +
+ ) +} diff --git a/console/src/views/settings/Settings.tsx b/console/src/views/settings/Settings.tsx index 137a6d29..be819de5 100644 --- a/console/src/views/settings/Settings.tsx +++ b/console/src/views/settings/Settings.tsx @@ -9,6 +9,7 @@ import { Zap, Mail, Smartphone, + UserPlus, } from "lucide-react" import { ProjectContext } from "../../contexts" import { ProjectRoleRequired } from "../project/ProjectRoleRequired" @@ -29,6 +30,7 @@ export default function Settings() { { key: "general", to: "", label: t("general"), icon: SettingsLucideIcon }, { key: "locales", to: "locales", label: t("locales"), icon: Globe }, { key: "api-keys", to: "api-keys", label: t("api_keys"), icon: Key }, + { key: "invites", to: "invites", label: t("invites"), icon: UserPlus }, { key: "subscriptions", to: "subscriptions", label: t("subscriptions"), icon: Bell }, { key: "event-schemas", diff --git a/console/src/views/users/ListDetail.tsx b/console/src/views/users/ListDetail.tsx index 93312302..f4c18980 100644 --- a/console/src/views/users/ListDetail.tsx +++ b/console/src/views/users/ListDetail.tsx @@ -537,12 +537,12 @@ export default function ListDetail() {
- +
diff --git a/console/src/views/users/rules/OrganizationEventRuleEdit.tsx b/console/src/views/users/rules/OrganizationEventRuleEdit.tsx index 2c706d6d..e97ea56c 100644 --- a/console/src/views/users/rules/OrganizationEventRuleEdit.tsx +++ b/console/src/views/users/rules/OrganizationEventRuleEdit.tsx @@ -239,7 +239,10 @@ export default function OrganizationEventRuleEdit({ diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index 50507cee..6e221599 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -180,7 +180,10 @@ func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.R Offset: params.Offset.ToInt(), } - invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination) + expiresBefore := params.ExpiresBefore.GoString() + expiresAfter := params.ExpiresAfter.GoString() + + invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, &expiresBefore, &expiresAfter) if err != nil { logger.Error("failed to list project invites", zap.Error(err)) oapi.WriteProblem(w, err) diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index 4e09fa50..c4a1b08b 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -1755,6 +1755,35 @@ paths: type: string format: uuid description: The project ID + - name: status + in: query + required: false + schema: + type: string + enum: [pending, accepted, revoked, expired] + description: Filter invites by status + - name: role + in: query + required: false + schema: + type: string + enum: [support, client, editor, admin] + description: Filter invites by role + - name: expires_after + in: query + required: false + schema: + type: string + format: date + description: Filter invites that expire after a certain date + - name: expires_before + in: query + required: false + schema: + type: string + format: date + description: Filter invites that expire before a certain date + - $ref: "#/components/parameters/Search" - $ref: "#/components/parameters/Limit" - $ref: "#/components/parameters/Offset" responses: @@ -1779,6 +1808,7 @@ paths: schema: type: string description: The project invite token + example: "abc123def456" - name: projectID in: path required: true @@ -1796,7 +1826,7 @@ paths: default: $ref: "#/components/responses/Error" - /api/admin/project/{projectID}/invites/{token}: + /api/admin/projects/{projectID}/invites/{token}: delete: summary: Revoke a project invite description: Revokes a project invite using the invite token, preventing it from being accepted @@ -1806,19 +1836,20 @@ paths: security: - HttpBearerAuth: [] parameters: - - name: token + - name: projectID in: path required: true schema: type: string - description: The project invite token - - name: projectID + format: uuid + description: The project ID + - name: token in: path required: true schema: type: string - format: uuid - description: The project ID + description: The project invite token + example: "abc123def456" responses: "204": description: Project invite revoked successfully @@ -1839,6 +1870,7 @@ paths: schema: type: string description: The project invite token + example: "abc123def456" responses: "200": description: Project invite details retrieved successfully diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index bce2f624..0040e7c5 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -198,6 +198,22 @@ const ( UpdateUserScheduledRequestResumeImmediately UpdateUserScheduledRequestResume = "immediately" ) +// Defines values for ListProjectInvitesParamsStatus. +const ( + Accepted ListProjectInvitesParamsStatus = "accepted" + Expired ListProjectInvitesParamsStatus = "expired" + Pending ListProjectInvitesParamsStatus = "pending" + Revoked ListProjectInvitesParamsStatus = "revoked" +) + +// Defines values for ListProjectInvitesParamsRole. +const ( + ListProjectInvitesParamsRoleAdmin ListProjectInvitesParamsRole = "admin" + ListProjectInvitesParamsRoleClient ListProjectInvitesParamsRole = "client" + ListProjectInvitesParamsRoleEditor ListProjectInvitesParamsRole = "editor" + ListProjectInvitesParamsRoleSupport ListProjectInvitesParamsRole = "support" +) + // Defines values for ListSenderIdentitiesParamsChannel. const ( ListSenderIdentitiesParamsChannelEmail ListSenderIdentitiesParamsChannel = "email" @@ -2061,6 +2077,15 @@ type ListEmailTemplatesParams struct { // ListProjectInvitesParams defines parameters for ListProjectInvites. type ListProjectInvitesParams struct { + // Status Filter invites by status + Status *ListProjectInvitesParamsStatus `form:"status,omitempty" json:"status,omitempty"` + Role *ListProjectInvitesParamsRole `form:"role,omitempty" json:"role,omitempty"` + ExpiresAfter *openapi_types.Date `form:"expires_after,omitempty" json:"expires_after,omitempty"` + ExpiresBefore *openapi_types.Date `form:"expires_before,omitempty" json:"expires_before,omitempty"` + + // Search Search query string + Search *Search `form:"search,omitempty" json:"search,omitempty"` + // Limit Maximum number of items to return Limit *Limit `form:"limit,omitempty" json:"limit,omitempty"` @@ -2068,6 +2093,12 @@ type ListProjectInvitesParams struct { Offset *Offset `form:"offset,omitempty" json:"offset,omitempty"` } +// ListProjectInvitesParamsStatus defines parameters for ListProjectInvites. +type ListProjectInvitesParamsStatus string + +// ListProjectInvitesParamsRole defines parameters for ListProjectInvites. +type ListProjectInvitesParamsRole string + // ListJourneysParams defines parameters for ListJourneys. type ListJourneysParams struct { // Limit Maximum number of items to return @@ -2567,9 +2598,6 @@ type ClientInterface interface { // GetProfile request GetProfile(ctx context.Context, reqEditors ...RequestEditorFn) (*http.Response, error) - // RevokeProjectInvite request - RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) - // ListProjects request ListProjects(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -2744,6 +2772,9 @@ type ClientInterface interface { // AcceptProjectInvite request AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) + // RevokeProjectInvite request + RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) + // ListJourneys request ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3157,18 +3188,6 @@ func (c *Client) GetProfile(ctx context.Context, reqEditors ...RequestEditorFn) return c.Client.Do(req) } -func (c *Client) RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewRevokeProjectInviteRequest(c.Server, projectID, token) - if err != nil { - return nil, err - } - req = req.WithContext(ctx) - if err := c.applyEditors(ctx, req, reqEditors); err != nil { - return nil, err - } - return c.Client.Do(req) -} - func (c *Client) ListProjects(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListProjectsRequest(c.Server, params) if err != nil { @@ -3925,6 +3944,18 @@ func (c *Client) AcceptProjectInvite(ctx context.Context, projectID openapi_type return c.Client.Do(req) } +func (c *Client) RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewRevokeProjectInviteRequest(c.Server, projectID, token) + if err != nil { + return nil, err + } + req = req.WithContext(ctx) + if err := c.applyEditors(ctx, req, reqEditors); err != nil { + return nil, err + } + return c.Client.Do(req) +} + func (c *Client) ListJourneys(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*http.Response, error) { req, err := NewListJourneysRequest(c.Server, projectID, params) if err != nil { @@ -5692,47 +5723,6 @@ func NewGetProfileRequest(server string) (*http.Request, error) { return req, nil } -// NewRevokeProjectInviteRequest generates requests for RevokeProjectInvite -func NewRevokeProjectInviteRequest(server string, projectID openapi_types.UUID, token string) (*http.Request, error) { - var err error - - var pathParam0 string - - pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) - if err != nil { - return nil, err - } - - var pathParam1 string - - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) - if err != nil { - return nil, err - } - - serverURL, err := url.Parse(server) - if err != nil { - return nil, err - } - - operationPath := fmt.Sprintf("/api/admin/project/%s/invites/%s", pathParam0, pathParam1) - if operationPath[0] == '/' { - operationPath = "." + operationPath - } - - queryURL, err := serverURL.Parse(operationPath) - if err != nil { - return nil, err - } - - req, err := http.NewRequest("DELETE", queryURL.String(), nil) - if err != nil { - return nil, err - } - - return req, nil -} - // NewListProjectsRequest generates requests for ListProjects func NewListProjectsRequest(server string, params *ListProjectsParams) (*http.Request, error) { var err error @@ -8202,6 +8192,86 @@ func NewListProjectInvitesRequest(server string, projectID openapi_types.UUID, p if params != nil { queryValues := queryURL.Query() + if params.Status != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "status", runtime.ParamLocationQuery, *params.Status); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Role != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "role", runtime.ParamLocationQuery, *params.Role); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.ExpiresAfter != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "expires_after", runtime.ParamLocationQuery, *params.ExpiresAfter); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.ExpiresBefore != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "expires_before", runtime.ParamLocationQuery, *params.ExpiresBefore); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + + if params.Search != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "search", runtime.ParamLocationQuery, *params.Search); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + if params.Limit != nil { if queryFrag, err := runtime.StyleParamWithLocation("form", true, "limit", runtime.ParamLocationQuery, *params.Limit); err != nil { @@ -8333,6 +8403,47 @@ func NewAcceptProjectInviteRequest(server string, projectID openapi_types.UUID, return req, nil } +// NewRevokeProjectInviteRequest generates requests for RevokeProjectInvite +func NewRevokeProjectInviteRequest(server string, projectID openapi_types.UUID, token string) (*http.Request, error) { + var err error + + var pathParam0 string + + pathParam0, err = runtime.StyleParamWithLocation("simple", false, "projectID", runtime.ParamLocationPath, projectID) + if err != nil { + return nil, err + } + + var pathParam1 string + + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) + if err != nil { + return nil, err + } + + serverURL, err := url.Parse(server) + if err != nil { + return nil, err + } + + operationPath := fmt.Sprintf("/api/admin/projects/%s/invites/%s", pathParam0, pathParam1) + if operationPath[0] == '/' { + operationPath = "." + operationPath + } + + queryURL, err := serverURL.Parse(operationPath) + if err != nil { + return nil, err + } + + req, err := http.NewRequest("DELETE", queryURL.String(), nil) + if err != nil { + return nil, err + } + + return req, nil +} + // NewListJourneysRequest generates requests for ListJourneys func NewListJourneysRequest(server string, projectID openapi_types.UUID, params *ListJourneysParams) (*http.Request, error) { var err error @@ -14155,9 +14266,6 @@ type ClientWithResponsesInterface interface { // GetProfileWithResponse request GetProfileWithResponse(ctx context.Context, reqEditors ...RequestEditorFn) (*GetProfileResponse, error) - // RevokeProjectInviteWithResponse request - RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) - // ListProjectsWithResponse request ListProjectsWithResponse(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*ListProjectsResponse, error) @@ -14332,6 +14440,9 @@ type ClientWithResponsesInterface interface { // AcceptProjectInviteWithResponse request AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) + // RevokeProjectInviteWithResponse request + RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) + // ListJourneysWithResponse request ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) @@ -14756,28 +14867,6 @@ func (r GetProfileResponse) StatusCode() int { return 0 } -type RevokeProjectInviteResponse struct { - Body []byte - HTTPResponse *http.Response - JSONDefault *Error -} - -// Status returns HTTPResponse.Status -func (r RevokeProjectInviteResponse) Status() string { - if r.HTTPResponse != nil { - return r.HTTPResponse.Status - } - return http.StatusText(0) -} - -// StatusCode returns HTTPResponse.StatusCode -func (r RevokeProjectInviteResponse) StatusCode() int { - if r.HTTPResponse != nil { - return r.HTTPResponse.StatusCode - } - return 0 -} - type ListProjectsResponse struct { Body []byte HTTPResponse *http.Response @@ -15897,6 +15986,28 @@ func (r AcceptProjectInviteResponse) StatusCode() int { return 0 } +type RevokeProjectInviteResponse struct { + Body []byte + HTTPResponse *http.Response + JSONDefault *Error +} + +// Status returns HTTPResponse.Status +func (r RevokeProjectInviteResponse) Status() string { + if r.HTTPResponse != nil { + return r.HTTPResponse.Status + } + return http.StatusText(0) +} + +// StatusCode returns HTTPResponse.StatusCode +func (r RevokeProjectInviteResponse) StatusCode() int { + if r.HTTPResponse != nil { + return r.HTTPResponse.StatusCode + } + return 0 +} + type ListJourneysResponse struct { Body []byte HTTPResponse *http.Response @@ -18441,15 +18552,6 @@ func (c *ClientWithResponses) GetProfileWithResponse(ctx context.Context, reqEdi return ParseGetProfileResponse(rsp) } -// RevokeProjectInviteWithResponse request returning *RevokeProjectInviteResponse -func (c *ClientWithResponses) RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) { - rsp, err := c.RevokeProjectInvite(ctx, projectID, token, reqEditors...) - if err != nil { - return nil, err - } - return ParseRevokeProjectInviteResponse(rsp) -} - // ListProjectsWithResponse request returning *ListProjectsResponse func (c *ClientWithResponses) ListProjectsWithResponse(ctx context.Context, params *ListProjectsParams, reqEditors ...RequestEditorFn) (*ListProjectsResponse, error) { rsp, err := c.ListProjects(ctx, params, reqEditors...) @@ -19002,6 +19104,15 @@ func (c *ClientWithResponses) AcceptProjectInviteWithResponse(ctx context.Contex return ParseAcceptProjectInviteResponse(rsp) } +// RevokeProjectInviteWithResponse request returning *RevokeProjectInviteResponse +func (c *ClientWithResponses) RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) { + rsp, err := c.RevokeProjectInvite(ctx, projectID, token, reqEditors...) + if err != nil { + return nil, err + } + return ParseRevokeProjectInviteResponse(rsp) +} + // ListJourneysWithResponse request returning *ListJourneysResponse func (c *ClientWithResponses) ListJourneysWithResponse(ctx context.Context, projectID openapi_types.UUID, params *ListJourneysParams, reqEditors ...RequestEditorFn) (*ListJourneysResponse, error) { rsp, err := c.ListJourneys(ctx, projectID, params, reqEditors...) @@ -20305,32 +20416,6 @@ func ParseGetProfileResponse(rsp *http.Response) (*GetProfileResponse, error) { return response, nil } -// ParseRevokeProjectInviteResponse parses an HTTP response from a RevokeProjectInviteWithResponse call -func ParseRevokeProjectInviteResponse(rsp *http.Response) (*RevokeProjectInviteResponse, error) { - bodyBytes, err := io.ReadAll(rsp.Body) - defer func() { _ = rsp.Body.Close() }() - if err != nil { - return nil, err - } - - response := &RevokeProjectInviteResponse{ - Body: bodyBytes, - HTTPResponse: rsp, - } - - switch { - case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: - var dest Error - if err := json.Unmarshal(bodyBytes, &dest); err != nil { - return nil, err - } - response.JSONDefault = &dest - - } - - return response, nil -} - // ParseListProjectsResponse parses an HTTP response from a ListProjectsWithResponse call func ParseListProjectsResponse(rsp *http.Response) (*ListProjectsResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -21870,6 +21955,32 @@ func ParseAcceptProjectInviteResponse(rsp *http.Response) (*AcceptProjectInviteR return response, nil } +// ParseRevokeProjectInviteResponse parses an HTTP response from a RevokeProjectInviteWithResponse call +func ParseRevokeProjectInviteResponse(rsp *http.Response) (*RevokeProjectInviteResponse, error) { + bodyBytes, err := io.ReadAll(rsp.Body) + defer func() { _ = rsp.Body.Close() }() + if err != nil { + return nil, err + } + + response := &RevokeProjectInviteResponse{ + Body: bodyBytes, + HTTPResponse: rsp, + } + + switch { + case strings.Contains(rsp.Header.Get("Content-Type"), "json") && true: + var dest Error + if err := json.Unmarshal(bodyBytes, &dest); err != nil { + return nil, err + } + response.JSONDefault = &dest + + } + + return response, nil +} + // ParseListJourneysResponse parses an HTTP response from a ListJourneysWithResponse call func ParseListJourneysResponse(rsp *http.Response) (*ListJourneysResponse, error) { bodyBytes, err := io.ReadAll(rsp.Body) @@ -25318,9 +25429,6 @@ type ServerInterface interface { // Get current admin profile // (GET /api/admin/profile) GetProfile(w http.ResponseWriter, r *http.Request) - // Revoke a project invite - // (DELETE /api/admin/project/{projectID}/invites/{token}) - RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) // List projects // (GET /api/admin/projects) ListProjects(w http.ResponseWriter, r *http.Request, params ListProjectsParams) @@ -25465,6 +25573,9 @@ type ServerInterface interface { // Accept a project invite // (POST /api/admin/projects/{projectID}/invites/accept/{token}) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) + // Revoke a project invite + // (DELETE /api/admin/projects/{projectID}/invites/{token}) + RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) // List journeys // (GET /api/admin/projects/{projectID}/journeys) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) @@ -25807,12 +25918,6 @@ func (_ Unimplemented) GetProfile(w http.ResponseWriter, r *http.Request) { w.WriteHeader(http.StatusNotImplemented) } -// Revoke a project invite -// (DELETE /api/admin/project/{projectID}/invites/{token}) -func (_ Unimplemented) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) { - w.WriteHeader(http.StatusNotImplemented) -} - // List projects // (GET /api/admin/projects) func (_ Unimplemented) ListProjects(w http.ResponseWriter, r *http.Request, params ListProjectsParams) { @@ -26101,6 +26206,12 @@ func (_ Unimplemented) AcceptProjectInvite(w http.ResponseWriter, r *http.Reques w.WriteHeader(http.StatusNotImplemented) } +// Revoke a project invite +// (DELETE /api/admin/projects/{projectID}/invites/{token}) +func (_ Unimplemented) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) { + w.WriteHeader(http.StatusNotImplemented) +} + // List journeys // (GET /api/admin/projects/{projectID}/journeys) func (_ Unimplemented) ListJourneys(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, params ListJourneysParams) { @@ -26790,46 +26901,6 @@ func (siw *ServerInterfaceWrapper) GetProfile(w http.ResponseWriter, r *http.Req handler.ServeHTTP(w, r) } -// RevokeProjectInvite operation middleware -func (siw *ServerInterfaceWrapper) RevokeProjectInvite(w http.ResponseWriter, r *http.Request) { - - var err error - - // ------------- Path parameter "projectID" ------------- - var projectID openapi_types.UUID - - err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) - return - } - - // ------------- Path parameter "token" ------------- - var token string - - err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) - if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) - return - } - - ctx := r.Context() - - ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) - - r = r.WithContext(ctx) - - handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.RevokeProjectInvite(w, r, projectID, token) - })) - - for _, middleware := range siw.HandlerMiddlewares { - handler = middleware(handler) - } - - handler.ServeHTTP(w, r) -} - // ListProjects operation middleware func (siw *ServerInterfaceWrapper) ListProjects(w http.ResponseWriter, r *http.Request) { @@ -28785,6 +28856,46 @@ func (siw *ServerInterfaceWrapper) ListProjectInvites(w http.ResponseWriter, r * // Parameter object where we will unmarshal all parameters from the context var params ListProjectInvitesParams + // ------------- Optional query parameter "status" ------------- + + err = runtime.BindQueryParameter("form", true, false, "status", r.URL.Query(), ¶ms.Status) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "status", Err: err}) + return + } + + // ------------- Optional query parameter "role" ------------- + + err = runtime.BindQueryParameter("form", true, false, "role", r.URL.Query(), ¶ms.Role) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "role", Err: err}) + return + } + + // ------------- Optional query parameter "expires_after" ------------- + + err = runtime.BindQueryParameter("form", true, false, "expires_after", r.URL.Query(), ¶ms.ExpiresAfter) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expires_after", Err: err}) + return + } + + // ------------- Optional query parameter "expires_before" ------------- + + err = runtime.BindQueryParameter("form", true, false, "expires_before", r.URL.Query(), ¶ms.ExpiresBefore) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "expires_before", Err: err}) + return + } + + // ------------- Optional query parameter "search" ------------- + + err = runtime.BindQueryParameter("form", true, false, "search", r.URL.Query(), ¶ms.Search) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "search", Err: err}) + return + } + // ------------- Optional query parameter "limit" ------------- err = runtime.BindQueryParameter("form", true, false, "limit", r.URL.Query(), ¶ms.Limit) @@ -28883,6 +28994,46 @@ func (siw *ServerInterfaceWrapper) AcceptProjectInvite(w http.ResponseWriter, r handler.ServeHTTP(w, r) } +// RevokeProjectInvite operation middleware +func (siw *ServerInterfaceWrapper) RevokeProjectInvite(w http.ResponseWriter, r *http.Request) { + + var err error + + // ------------- Path parameter "projectID" ------------- + var projectID openapi_types.UUID + + err = runtime.BindStyledParameterWithOptions("simple", "projectID", chi.URLParam(r, "projectID"), &projectID, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "projectID", Err: err}) + return + } + + // ------------- Path parameter "token" ------------- + var token string + + err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) + return + } + + ctx := r.Context() + + ctx = context.WithValue(ctx, HttpBearerAuthScopes, []string{}) + + r = r.WithContext(ctx) + + handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + siw.Handler.RevokeProjectInvite(w, r, projectID, token) + })) + + for _, middleware := range siw.HandlerMiddlewares { + handler = middleware(handler) + } + + handler.ServeHTTP(w, r) +} + // ListJourneys operation middleware func (siw *ServerInterfaceWrapper) ListJourneys(w http.ResponseWriter, r *http.Request) { @@ -33624,9 +33775,6 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/profile", wrapper.GetProfile) }) - r.Group(func(r chi.Router) { - r.Delete(options.BaseURL+"/api/admin/project/{projectID}/invites/{token}", wrapper.RevokeProjectInvite) - }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects", wrapper.ListProjects) }) @@ -33771,6 +33919,9 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Group(func(r chi.Router) { r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites/accept/{token}", wrapper.AcceptProjectInvite) }) + r.Group(func(r chi.Router) { + r.Delete(options.BaseURL+"/api/admin/projects/{projectID}/invites/{token}", wrapper.RevokeProjectInvite) + }) r.Group(func(r chi.Router) { r.Get(options.BaseURL+"/api/admin/projects/{projectID}/journeys", wrapper.ListJourneys) }) diff --git a/internal/store/management/invites.go b/internal/store/management/invites.go index c13693ad..9b69c430 100644 --- a/internal/store/management/invites.go +++ b/internal/store/management/invites.go @@ -22,8 +22,8 @@ type Invite struct { ID uuid.UUID `db:"id"` ProjectID uuid.UUID `db:"project_id"` InviterAdminID uuid.UUID `db:"inviter_admin_id"` - invitee_email string `db:"invitee_email"` - token string `db:"token"` + InviteeEmail string `db:"invitee_email"` + Token string `db:"token"` Role string `db:"role"` ExpiresAt time.Time `db:"expires_at"` AcceptedAt *time.Time `db:"accepted_at"` @@ -33,14 +33,14 @@ type Invite struct { func (invite *Invite) OAPI() oapi.ProjectInvite { role := oapi.ProjectInviteRole(invite.Role) - inviteeEmail := types.Email(invite.invitee_email) + inviteeEmail := types.Email(invite.InviteeEmail) return oapi.ProjectInvite{ Id: &invite.ID, ProjectId: &invite.ProjectID, InviterAdminId: &invite.InviterAdminID, InviteeEmail: &inviteeEmail, - Token: &invite.token, + Token: &invite.Token, Role: &role, ExpiresAt: &invite.ExpiresAt, AcceptedAt: invite.AcceptedAt, @@ -50,7 +50,16 @@ func (invite *Invite) OAPI() oapi.ProjectInvite { func (s *InvitesStore) CreateProjectInvite(ctx context.Context, projectID uuid.UUID, inviterAdminID string, inviteeEmail string, role oapi.CreateProjectInviteRole, token string, expiresIn string) (*Invite, error) { stmt := ` - INSERT INTO invites (project_id, inviter_admin_id, invitee_email, role, token, expires_at) + WITH revoked AS ( + UPDATE project_invites + SET revoked_at = NOW() + WHERE project_id = $1 + AND invitee_email = $3 + AND revoked_at IS NULL + AND accepted_at IS NULL + AND expires_at > NOW() + ) + INSERT INTO project_invites (project_id, inviter_admin_id, invitee_email, role, token, expires_at) VALUES ($1, $2, $3, $4, $5, NOW() + $6::interval) RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` @@ -65,7 +74,7 @@ func (s *InvitesStore) CreateProjectInvite(ctx context.Context, projectID uuid.U func (s *InvitesStore) GetInviteByToken(ctx context.Context, token string) (*Invite, error) { stmt := ` SELECT id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at - FROM invites + FROM project_invites WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW()` var invite Invite @@ -78,7 +87,7 @@ func (s *InvitesStore) GetInviteByToken(ctx context.Context, token string) (*Inv func (s *InvitesStore) AcceptProjectInvite(ctx context.Context, token string) (*Invite, error) { stmt := ` - UPDATE invites + UPDATE project_invites SET accepted_at = NOW() WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` @@ -93,9 +102,9 @@ func (s *InvitesStore) AcceptProjectInvite(ctx context.Context, token string) (* func (s *InvitesStore) RevokeProjectInvite(ctx context.Context, token string) (*Invite, error) { stmt := ` - UPDATE invites + UPDATE project_invites SET revoked_at = NOW() - WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() + WHERE token = $1 AND revoked_at IS NULL AND accepted_at IS NULL RETURNING id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at` var invite Invite @@ -106,27 +115,47 @@ func (s *InvitesStore) RevokeProjectInvite(ctx context.Context, token string) (* return &invite, nil } -func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UUID, pagination store.Pagination) ([]Invite, int, error) { +func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UUID, pagination store.Pagination, search string, role *oapi.ListProjectInvitesParamsRole, status *oapi.ListProjectInvitesParamsStatus, expiresBefore *string, expiresAfter *string) ([]Invite, int, error) { countStmt := ` SELECT COUNT(*) - FROM invites - WHERE project_id = $1 AND revoked_at IS NULL AND accepted_at IS NULL` + FROM project_invites + WHERE project_id = $1 + AND ($2::text IS NULL OR $2::text = '' OR invitee_email ILIKE '%' || $2 || '%') + AND ($3::text IS NULL OR role = $3) + AND ($4::text IS NULL OR ( + $4 = 'pending' AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() OR + $4 = 'accepted' AND accepted_at IS NOT NULL OR + $4 = 'revoked' AND revoked_at IS NOT NULL OR + $4 = 'expired' AND expires_at <= NOW() AND accepted_at IS NULL AND revoked_at IS NULL + )) + AND ($5::date IS NULL OR expires_at >= $5::date) + AND ($6::date IS NULL OR expires_at <= $6::date)` var total int - err := s.db.GetContext(ctx, &total, countStmt, projectID) + err := s.db.GetContext(ctx, &total, countStmt, projectID, search, role, status, expiresBefore, expiresAfter) if err != nil { return nil, 0, err } stmt := ` SELECT id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at - FROM invites - WHERE project_id = $1 AND revoked_at IS NULL AND accepted_at IS NULL + FROM project_invites + WHERE project_id = $1 + AND ($2::text IS NULL OR $2::text = '' OR invitee_email ILIKE '%' || $2 || '%') + AND ($3::text IS NULL OR role = $3) + AND ($4::text IS NULL OR ( + $4 = 'pending' AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() OR + $4 = 'accepted' AND accepted_at IS NOT NULL OR + $4 = 'revoked' AND revoked_at IS NOT NULL OR + $4 = 'expired' AND expires_at <= NOW() AND accepted_at IS NULL AND revoked_at IS NULL + )) + AND ($5::date IS NULL OR expires_at >= $5::date) + AND ($6::date IS NULL OR expires_at <= $6::date) ORDER BY created_at DESC - LIMIT $2 OFFSET $3` + LIMIT $7 OFFSET $8` var invites []Invite - err = s.db.SelectContext(ctx, &invites, stmt, projectID, pagination.Limit, pagination.Offset) + err = s.db.SelectContext(ctx, &invites, stmt, projectID, search, role, status, expiresBefore, expiresAfter, pagination.Limit, pagination.Offset) if err != nil { return nil, 0, err } From 212801b9eeb8e0a3b93e59d6b66c65618c7d3404 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Thu, 23 Apr 2026 15:06:18 +0200 Subject: [PATCH 05/22] feat: add inviter admin email and filter to project invites management --- console/src/api.ts | 1 + console/src/oapi/management.generated.ts | 2 + console/src/types.ts | 1 + console/src/views/settings/Invites.tsx | 69 ++++++++++++++++++- .../http/controllers/v1/management/invites.go | 14 +++- .../v1/management/oapi/resources.yml | 4 ++ .../v1/management/oapi/resources_gen.go | 17 ++--- internal/store/management/invites.go | 65 ++++++++--------- 8 files changed, 128 insertions(+), 45 deletions(-) diff --git a/console/src/api.ts b/console/src/api.ts index ef7dac71..518aad52 100644 --- a/console/src/api.ts +++ b/console/src/api.ts @@ -211,6 +211,7 @@ const api = { role?: string expires_after?: string expires_before?: string + inviter_admin_id?: string }, ) => await client diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index 3700de6b..efaaf562 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -4750,6 +4750,8 @@ export interface components { * @example 5143f27c-cca9-4dc4-9059-e1dbb08144ad */ inviter_admin_id?: string; + /** @example admin@example.com */ + inviter_admin_email?: string | null; /** * Format: email * @example user@example.com diff --git a/console/src/types.ts b/console/src/types.ts index ee82d81c..81f1b057 100644 --- a/console/src/types.ts +++ b/console/src/types.ts @@ -336,6 +336,7 @@ export interface ProjectInvite { id: UUID project_id: UUID inviter_admin_id: UUID + inviter_admin_email: string | null invitee_email: string role: ProjectRole token: string diff --git a/console/src/views/settings/Invites.tsx b/console/src/views/settings/Invites.tsx index 4027e434..b75b56fe 100644 --- a/console/src/views/settings/Invites.tsx +++ b/console/src/views/settings/Invites.tsx @@ -54,6 +54,7 @@ export default function Invites() { const [roleFilter, setRoleFilter] = useState(undefined) const [expiresAfter, setExpiresAfter] = useState("") const [expiresBefore, setExpiresBefore] = useState("") + const [inviterAdminFilter, setInviterAdminFilter] = useState(undefined) const [page, setPage] = useState(1) const limit = 15 const searchTimeoutRef = useRef>(setTimeout(() => {}, 0)) @@ -89,15 +90,27 @@ export default function Invites() { setPage(1) }, []) + const handleInviterAdminFilterChange = useCallback((id: string | undefined) => { + setInviterAdminFilter(id) + setPage(1) + }, []) + const clearFilters = useCallback(() => { setStatusFilter(undefined) setRoleFilter(undefined) setExpiresAfter("") setExpiresBefore("") + setInviterAdminFilter(undefined) setPage(1) }, []) - const hasActiveFilters = statusFilter || roleFilter || expiresAfter || expiresBefore + const hasActiveFilters = statusFilter || roleFilter || expiresAfter || expiresBefore || inviterAdminFilter + + const [adminsResult] = useResolver( + useCallback(async () => { + return await api.projectAdmins.search(project.id, { limit: 100 }) + }, [project.id]), + ) const [result, , reload] = useResolver( useCallback(async () => { @@ -109,6 +122,7 @@ export default function Invites() { role: roleFilter, expires_after: expiresAfter || undefined, expires_before: expiresBefore || undefined, + inviter_admin_id: inviterAdminFilter, }) }, [ project.id, @@ -117,6 +131,7 @@ export default function Invites() { roleFilter, expiresAfter, expiresBefore, + inviterAdminFilter, page, ]), ) @@ -250,6 +265,40 @@ export default function Invites() { ))} +
+ +
+ + {adminsResult?.results.map((admin) => ( + + ))} +
+
@@ -309,8 +358,11 @@ export default function Invites() { - {t("email")} + {t("invitee_email", "Invitee")} {t("role")} + + {t("invited_by", "Invited by")} + {t("expires")} {t("status")} @@ -326,6 +378,9 @@ export default function Invites() { + + + @@ -339,7 +394,7 @@ export default function Invites() { )) ) : invites.length === 0 ? ( - +

@@ -385,6 +440,14 @@ export default function Invites() { {snakeToTitle(invite.role)} + +

+ + + {invite.inviter_admin_email ?? "—"} + +
+ {formatDate(invite.expires_at)} diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index 6e221599..34aa32e5 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -6,6 +6,7 @@ import ( "errors" "math/rand" "net/http" + "time" "github.com/google/uuid" "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" @@ -180,10 +181,17 @@ func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.R Offset: params.Offset.ToInt(), } - expiresBefore := params.ExpiresBefore.GoString() - expiresAfter := params.ExpiresAfter.GoString() + var expiresBefore, expiresAfter *string + if params.ExpiresBefore != nil { + s := params.ExpiresBefore.Time.Format(time.RFC3339) + expiresBefore = &s + } + if params.ExpiresAfter != nil { + s := params.ExpiresAfter.Time.Format(time.RFC3339) + expiresAfter = &s + } - invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, &expiresBefore, &expiresAfter) + invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, expiresBefore, expiresAfter) if err != nil { logger.Error("failed to list project invites", zap.Error(err)) oapi.WriteProblem(w, err) diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index c4a1b08b..2ea522a0 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -9121,6 +9121,10 @@ components: type: string format: uuid example: "5143f27c-cca9-4dc4-9059-e1dbb08144ad" + inviter_admin_email: + type: string + example: "admin@example.com" + nullable: true invitee_email: type: string format: email diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 0040e7c5..330eef4e 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -1120,14 +1120,15 @@ type ProjectAdminList struct { // ProjectInvite defines model for ProjectInvite. type ProjectInvite struct { - AcceptedAt *time.Time `json:"accepted_at"` - ExpiresAt *time.Time `json:"expires_at,omitempty"` - Id *openapi_types.UUID `json:"id,omitempty"` - InviteeEmail *openapi_types.Email `json:"invitee_email,omitempty"` - InviterAdminId *openapi_types.UUID `json:"inviter_admin_id,omitempty"` - ProjectId *openapi_types.UUID `json:"project_id,omitempty"` - RevokedAt *time.Time `json:"revoked_at"` - Role *ProjectInviteRole `json:"role,omitempty"` + AcceptedAt *time.Time `json:"accepted_at"` + ExpiresAt *time.Time `json:"expires_at,omitempty"` + Id *openapi_types.UUID `json:"id,omitempty"` + InviteeEmail *openapi_types.Email `json:"invitee_email,omitempty"` + InviterAdminEmail *string `json:"inviter_admin_email"` + InviterAdminId *openapi_types.UUID `json:"inviter_admin_id,omitempty"` + ProjectId *openapi_types.UUID `json:"project_id,omitempty"` + RevokedAt *time.Time `json:"revoked_at"` + Role *ProjectInviteRole `json:"role,omitempty"` // Token Unique token for the invite link Token *string `json:"token,omitempty"` diff --git a/internal/store/management/invites.go b/internal/store/management/invites.go index 9b69c430..cefb4be5 100644 --- a/internal/store/management/invites.go +++ b/internal/store/management/invites.go @@ -19,16 +19,17 @@ type InvitesStore struct { } type Invite struct { - ID uuid.UUID `db:"id"` - ProjectID uuid.UUID `db:"project_id"` - InviterAdminID uuid.UUID `db:"inviter_admin_id"` - InviteeEmail string `db:"invitee_email"` - Token string `db:"token"` - Role string `db:"role"` - ExpiresAt time.Time `db:"expires_at"` - AcceptedAt *time.Time `db:"accepted_at"` - RevokedAt *time.Time `db:"revoked_at"` - CreatedAt time.Time `db:"created_at"` + ID uuid.UUID `db:"id"` + ProjectID uuid.UUID `db:"project_id"` + InviterAdminID uuid.UUID `db:"inviter_admin_id"` + InviterAdminEmail *string `db:"inviter_admin_email"` + InviteeEmail string `db:"invitee_email"` + Token string `db:"token"` + Role string `db:"role"` + ExpiresAt time.Time `db:"expires_at"` + AcceptedAt *time.Time `db:"accepted_at"` + RevokedAt *time.Time `db:"revoked_at"` + CreatedAt time.Time `db:"created_at"` } func (invite *Invite) OAPI() oapi.ProjectInvite { @@ -36,15 +37,16 @@ func (invite *Invite) OAPI() oapi.ProjectInvite { inviteeEmail := types.Email(invite.InviteeEmail) return oapi.ProjectInvite{ - Id: &invite.ID, - ProjectId: &invite.ProjectID, - InviterAdminId: &invite.InviterAdminID, - InviteeEmail: &inviteeEmail, - Token: &invite.Token, - Role: &role, - ExpiresAt: &invite.ExpiresAt, - AcceptedAt: invite.AcceptedAt, - RevokedAt: invite.RevokedAt, + Id: &invite.ID, + ProjectId: &invite.ProjectID, + InviterAdminId: &invite.InviterAdminID, + InviteeEmail: &inviteeEmail, + InviterAdminEmail: invite.InviterAdminEmail, + Token: &invite.Token, + Role: &role, + ExpiresAt: &invite.ExpiresAt, + AcceptedAt: invite.AcceptedAt, + RevokedAt: invite.RevokedAt, } } @@ -138,20 +140,21 @@ func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UU } stmt := ` - SELECT id, project_id, inviter_admin_id, invitee_email, role, token, expires_at, created_at, revoked_at, accepted_at - FROM project_invites - WHERE project_id = $1 - AND ($2::text IS NULL OR $2::text = '' OR invitee_email ILIKE '%' || $2 || '%') - AND ($3::text IS NULL OR role = $3) + SELECT pi.id AS id, pi.project_id AS project_id, pi.inviter_admin_id AS inviter_admin_id, a.email AS inviter_admin_email, pi.invitee_email AS invitee_email, pi.role AS role, pi.token AS token, pi.expires_at AS expires_at, pi.created_at AS created_at, pi.revoked_at AS revoked_at, pi.accepted_at AS accepted_at + FROM project_invites as pi + INNER JOIN admins as a ON pi.inviter_admin_id = a.id + WHERE pi.project_id = $1 + AND ($2::text IS NULL OR $2::text = '' OR pi.invitee_email ILIKE '%' || $2 || '%') + AND ($3::text IS NULL OR pi.role = $3) AND ($4::text IS NULL OR ( - $4 = 'pending' AND revoked_at IS NULL AND accepted_at IS NULL AND expires_at > NOW() OR - $4 = 'accepted' AND accepted_at IS NOT NULL OR - $4 = 'revoked' AND revoked_at IS NOT NULL OR - $4 = 'expired' AND expires_at <= NOW() AND accepted_at IS NULL AND revoked_at IS NULL + $4 = 'pending' AND pi.revoked_at IS NULL AND pi.accepted_at IS NULL AND pi.expires_at > NOW() OR + $4 = 'accepted' AND pi.accepted_at IS NOT NULL OR + $4 = 'revoked' AND pi.revoked_at IS NOT NULL OR + $4 = 'expired' AND pi.expires_at <= NOW() AND pi.accepted_at IS NULL AND pi.revoked_at IS NULL )) - AND ($5::date IS NULL OR expires_at >= $5::date) - AND ($6::date IS NULL OR expires_at <= $6::date) - ORDER BY created_at DESC + AND ($5::date IS NULL OR pi.expires_at >= $5::date) + AND ($6::date IS NULL OR pi.expires_at <= $6::date) + ORDER BY pi.created_at DESC LIMIT $7 OFFSET $8` var invites []Invite From 3d1d15cbcfd21f0a65f3318e8b76aa561a58cc70 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Fri, 24 Apr 2026 16:36:01 +0200 Subject: [PATCH 06/22] feat: implement project invite acceptance and registration flow Co-authored-by: Copilot --- console/src/api.ts | 6 +- console/src/oapi/management.generated.ts | 2 + console/src/views/auth/Register.tsx | 13 + console/src/views/invites/AcceptInvite.tsx | 286 ++++++++++++++++++ console/src/views/router.tsx | 10 + console/src/views/settings/Invites.tsx | 61 +++- docker-compose.yml | 1 + internal/http/auth/auth.go | 24 +- .../controllers/v1/management/controller.go | 2 +- .../http/controllers/v1/management/invites.go | 72 ++++- .../v1/management/oapi/resources.yml | 7 + .../v1/management/oapi/resources_gen.go | 27 ++ internal/rbac/access/access.go | 12 + internal/store/management/invites.go | 12 +- 14 files changed, 516 insertions(+), 19 deletions(-) create mode 100644 console/src/views/auth/Register.tsx create mode 100644 console/src/views/invites/AcceptInvite.tsx diff --git a/console/src/api.ts b/console/src/api.ts index 518aad52..1c949435 100644 --- a/console/src/api.ts +++ b/console/src/api.ts @@ -86,11 +86,13 @@ export const client = Axios.create({ client.interceptors.response.use( (response) => response, async (error) => { - const isLoginPage = window.location.pathname.startsWith("/login") + const isPublicPage = + window.location.pathname.startsWith("/login") || + window.location.pathname.startsWith("/invites/") const isUserNotAuthenticated = error.response?.status === 401 const skipRedirect = error.config?.skipAuthRedirect - if (isUserNotAuthenticated && !isLoginPage && !skipRedirect) { + if (isUserNotAuthenticated && !isPublicPage && !skipRedirect) { api.auth.login() } throw error diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index efaaf562..c3e61e4b 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -6362,6 +6362,8 @@ export interface operations { role?: "support" | "client" | "editor" | "admin"; expires_after?: string; expires_before?: string; + /** @description Filter invites by the admin who created them */ + inviter_admin_id?: string; /** @description Search query string */ search?: components["parameters"]["Search"]; /** @description Maximum number of items to return */ diff --git a/console/src/views/auth/Register.tsx b/console/src/views/auth/Register.tsx new file mode 100644 index 00000000..e47e6c58 --- /dev/null +++ b/console/src/views/auth/Register.tsx @@ -0,0 +1,13 @@ +import { useSearchParams } from "react-router" +import { SignUp } from "@clerk/clerk-react" + +export default function Register() { + const [searchParams] = useSearchParams() + const redirect = searchParams.get("r") ?? "/" + + return ( +
+ +
+ ) +} diff --git a/console/src/views/invites/AcceptInvite.tsx b/console/src/views/invites/AcceptInvite.tsx new file mode 100644 index 00000000..089a3616 --- /dev/null +++ b/console/src/views/invites/AcceptInvite.tsx @@ -0,0 +1,286 @@ +import { useEffect, useState, useCallback } from "react" +import { useParams, useSearchParams, useNavigate } from "react-router" +import { useTranslation } from "react-i18next" +import { Loader2, Mail, ShieldAlert } from "lucide-react" + +import api from "../../api" +import oapiClient from "../../oapi/client" +import { AUTH_DRIVERS } from "../../types" +import type { ProjectInvite, AuthDriver } from "../../types" + +import { Button } from "@/components/ui/button" +import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" +import { Alert, AlertDescription, AlertTitle } from "@/components/ui/alert" +import { Badge } from "@/components/ui/badge" + +type PageState = + | { status: "loading" } + | { status: "error"; message: string } + | { status: "unauthenticated"; invite: ProjectInvite; drivers: AuthDriver[] } + | { status: "wrong-account"; invite: ProjectInvite } + | { status: "ready"; invite: ProjectInvite; profile: Admin } + | { status: "accepting" } + | { status: "accepted" } + +function formatExpiry(expiresAt: string): string { + return new Date(expiresAt).toLocaleDateString(undefined, { + year: "numeric", + month: "long", + day: "numeric", + }) +} + +export default function AcceptInvite() { + const { t } = useTranslation() + const { token } = useParams() as { token: string } + const [searchParams] = useSearchParams() + const navigate = useNavigate() + const autoAccept = searchParams.get("autoAccept") === "1" + + const [state, setState] = useState({ status: "loading" }) + + const doAccept = useCallback( + async (invite: ProjectInvite) => { + setState({ status: "accepting" }) + try { + const { error } = await oapiClient.POST( + "/api/admin/projects/{projectID}/invites/accept/{token}", + { + params: { + path: { + projectID: invite.project_id!, + token, + }, + }, + }, + ) + if (error) throw error + setState({ status: "accepted" }) + setTimeout(() => { + navigate(`/projects/${invite.project_id}`) + }, 1200) + } catch { + setState({ status: "error", message: t("invite_accept_failed", "Failed to accept the invite. Please try again.") }) + } + }, + [token, navigate, t], + ) + + useEffect(() => { + const init = async () => { + // Fetch invite details (public endpoint, no auth needed) + const { data: invite, error } = await oapiClient.GET("/api/invites/{token}", { + params: { path: { token } }, + }) + + if (error || !invite) { + setState({ status: "error", message: t("invite_not_found", "This invite link is invalid or has expired.") }) + return + } + + if (invite.accepted_at) { + setState({ status: "error", message: t("invite_already_accepted", "This invite has already been accepted.") }) + return + } + + if (invite.revoked_at) { + setState({ status: "error", message: t("invite_revoked", "This invite has been revoked.") }) + return + } + + // Check auth status in parallel with driver fetch + const [profileResult, driversResult] = await Promise.allSettled([ + api.profile.get(), + api.auth.methods(), + ]) + + const profile = profileResult.status === "fulfilled" ? profileResult.value : null + const drivers = + driversResult.status === "fulfilled" + ? driversResult.value + : [AUTH_DRIVERS.BASIC] + + if (!profile) { + // Not logged in + setState({ status: "unauthenticated", invite: invite as ProjectInvite, drivers }) + return + } + + // Logged in — check email match + if (profile.email.toLowerCase() !== (invite.invitee_email ?? "").toLowerCase()) { + setState({ status: "wrong-account", invite: invite as ProjectInvite }) + return + } + + if (autoAccept) { + // Came back from registration — auto-accept + await doAccept(invite as ProjectInvite) + return + } + + setState({ status: "ready", invite: invite as ProjectInvite, profile }) + } + + init() + }, [token, autoAccept, doAccept, t]) + + const handleLogin = () => { + navigate(`/login?r=${encodeURIComponent(`/invites/${token}`)}`) + } + + const handleRegister = () => { + navigate(`/register?r=${encodeURIComponent(`/invites/${token}?autoAccept=1`)}`) + } + + if (state.status === "loading" || state.status === "accepting") { + return ( +
+ + + +

+ {state.status === "accepting" + ? t("invite_accepting", "Accepting invite...") + : t("loading")} +

+
+
+
+ ) + } + + if (state.status === "accepted") { + return ( +
+ + +

+ {t("invite_accepted_redirecting", "Invite accepted! Redirecting...")} +

+
+
+
+ ) + } + + if (state.status === "error") { + return ( +
+ + + + + {t("error")} + {state.message} + + + +
+ ) + } + + if (state.status === "wrong-account") { + return ( +
+ + + {t("invite_wrong_account_title", "Wrong account")} + + + + + + {t("invite_wrong_account", "This invite was not sent to your account. Please log out and sign in with the correct account.")} + + + + +
+ ) + } + + if (state.status === "unauthenticated") { + const { invite, drivers } = state + const hasClerk = drivers.includes(AUTH_DRIVERS.CLERK) + + return ( +
+ + + + {t("invite_title", "You've been invited")} + + + {t("invite_sign_in_prompt", "Sign in or create an account to accept this invite.")} + + + + +
+ + {hasClerk && ( + + )} +
+
+
+
+ ) + } + + // status === "ready" + const { invite } = state + + return ( +
+ + + + {t("invite_title", "You've been invited")} + + + {t("invite_review_prompt", "Review the details below and accept to join.")} + + + + + + + +
+ ) +} + +function InviteDetails({ invite }: { invite: ProjectInvite }) { + const { t } = useTranslation() + + return ( +
+
+ {t("role")} + {invite.role} +
+ {invite.inviter_admin_email && ( +
+ {t("invited_by", "Invited by")} + + {invite.inviter_admin_email} + +
+ )} + {invite.expires_at && ( +
+ {t("expires", "Expires")} + {formatExpiry(invite.expires_at)} +
+ )} +
+ ) +} diff --git a/console/src/views/router.tsx b/console/src/views/router.tsx index dba4fc44..952bec2a 100644 --- a/console/src/views/router.tsx +++ b/console/src/views/router.tsx @@ -49,6 +49,8 @@ import NewIntegration from "./settings/NewIntegration" import IntegrationSetup from "./settings/IntegrationSetup" import Login from "./auth/Login" import LoginCallback from "./auth/LoginCallback" +import Register from "./auth/Register" +import AcceptInvite from "./invites/AcceptInvite" import Onboarding from "./auth/Onboarding" import OnboardingProject from "./auth/OnboardingProject" import { @@ -111,6 +113,14 @@ export const createRouter = ({ path: "/login/:driver/callback", element: , }, + { + path: "/register", + element: , + }, + { + path: "/invites/:token", + element: , + }, { path: "*", errorElement: , diff --git a/console/src/views/settings/Invites.tsx b/console/src/views/settings/Invites.tsx index b75b56fe..fd7960d2 100644 --- a/console/src/views/settings/Invites.tsx +++ b/console/src/views/settings/Invites.tsx @@ -43,6 +43,14 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu" import { Popover, PopoverContent, PopoverTrigger } from "@/components/ui/popover" +import { + Dialog, + DialogContent, + DialogDescription, + DialogFooter, + DialogHeader, + DialogTitle, +} from "@/components/ui/dialog" export default function Invites() { const { t } = useTranslation() @@ -60,6 +68,7 @@ export default function Invites() { const searchTimeoutRef = useRef>(setTimeout(() => {}, 0)) const [isCreating, setIsCreating] = useState(false) const [isSaving, setIsSaving] = useState(false) + const [createdInviteToken, setCreatedInviteToken] = useState(null) const handleSearch = useCallback((value: string) => { setSearchQuery(value) @@ -541,16 +550,64 @@ export default function Invites() { )}
+ { + if (!open) setCreatedInviteToken(null) + }} + > + + + {t("invite_created", "Invite created")} + + {t( + "invite_link_description", + "Share this link with the person you're inviting.", + )} + + +
+ (e.target as HTMLInputElement).select()} + /> + +
+ + + +
+
+ setIsCreating(false)} onSave={async (data) => { setIsSaving(true) try { - await api.invites.create(project.id, data) - toast.success(t("invite_created", "Invite created")) + const invite = await api.invites.create(project.id, data) await reload() setIsCreating(false) + setCreatedInviteToken(invite.token) } finally { setIsSaving(false) } diff --git a/docker-compose.yml b/docker-compose.yml index c89c06b2..d5a19966 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -26,6 +26,7 @@ services: AUTH_BASIC_PASSWORD: ${AUTH_BASIC_PASSWORD:-admin} AUTH_CLERK_SECRET_KEY: ${AUTH_CLERK_SECRET_KEY:-} AUTH_CLERK_WEBHOOK_SECRET: ${AUTH_CLERK_WEBHOOK_SECRET:-} + AUTH_JWKS_URL: ${AUTH_JWKS_URL:-} # Public URL used to generate user-facing links (e.g. preference center, unsubscribe) PUBLIC_URL: ${PUBLIC_URL:-http://localhost:8080} depends_on: diff --git a/internal/http/auth/auth.go b/internal/http/auth/auth.go index aaaff952..28066e79 100644 --- a/internal/http/auth/auth.go +++ b/internal/http/auth/auth.go @@ -40,6 +40,25 @@ func HMAC(secret []byte) jwt.Keyfunc { } } +// multiKeyfunc returns a keyfunc that dispatches to jwks for RS256 tokens and +// hmac for HS256 tokens, allowing both Clerk (RS256) and basic auth (HS256) to +// coexist when both are configured. +func multiKeyfunc(jwks, hmac jwt.Keyfunc) jwt.Keyfunc { + return func(token *jwt.Token) (any, error) { + switch token.Method.(type) { + case *jwt.SigningMethodRSA: + if jwks != nil { + return jwks(token) + } + case *jwt.SigningMethodHMAC: + if hmac != nil { + return hmac(token) + } + } + return nil, jwt.ErrTokenSignatureInvalid + } +} + type Handler func(ctx context.Context, token string) (context.Context, error) // Middleware is a middleware function that authenticates requests by verifying the @@ -69,10 +88,11 @@ func Middleware(middleware ...Handler) openapi3filter.AuthenticationFunc { } func WithJWT(config config.Auth, mgmt *management.State) Handler { - keyFunc := config.JWKS.Unwrap() + var hmacFunc jwt.Keyfunc if config.JWTSecret != "" { - keyFunc = HMAC([]byte(config.JWTSecret)) + hmacFunc = HMAC([]byte(config.JWTSecret)) } + keyFunc := multiKeyfunc(config.JWKS.Unwrap(), hmacFunc) return func(ctx context.Context, value string) (context.Context, error) { claims := jwt.RegisteredClaims{} diff --git a/internal/http/controllers/v1/management/controller.go b/internal/http/controllers/v1/management/controller.go index 86ab4ae5..9b21a72f 100644 --- a/internal/http/controllers/v1/management/controller.go +++ b/internal/http/controllers/v1/management/controller.go @@ -46,7 +46,7 @@ func NewController(logger *zap.Logger, managementDB, usersDB, journeyDB *sqlx.DB SenderIdentitiesController: NewSenderIdentitiesController(logger, managementDB, engine), PushProvidersController: NewPushProvidersController(logger, managementDB, registry, engine), BroadcastsController: NewBroadcastsController(logger, managementDB, usersDB, pub, jet, engine, consumer.Namespace(cfg.Nats.Namespace)), - InviteController: NewInviteController(logger, mgmt, engine), + InviteController: NewInviteController(logger, mgmt, engine, managementDB), } controller.AuthController, err = NewAuthController(logger, managementDB, cfg, engine) diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index 34aa32e5..a1b15ce3 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -9,10 +9,12 @@ import ( "time" "github.com/google/uuid" + "github.com/jmoiron/sqlx" "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" "github.com/lunogram/platform/internal/http/json" "github.com/lunogram/platform/internal/http/problem" "github.com/lunogram/platform/internal/rbac" + "github.com/lunogram/platform/internal/rbac/access" "github.com/lunogram/platform/internal/store" "github.com/lunogram/platform/internal/store/management" "go.uber.org/zap" @@ -22,13 +24,15 @@ type InviteController struct { logger *zap.Logger mgmt *management.State engine *rbac.Engine + db *sqlx.DB } -func NewInviteController(logger *zap.Logger, mgmt *management.State, engine *rbac.Engine) *InviteController { +func NewInviteController(logger *zap.Logger, mgmt *management.State, engine *rbac.Engine, db *sqlx.DB) *InviteController { return &InviteController{ logger: logger, mgmt: mgmt, engine: engine, + db: db, } } @@ -56,6 +60,19 @@ func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http. logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("email", string(body.Email))) logger.Info("creating project invite") + existingAdmin, err := srv.mgmt.GetAdminByEmail(ctx, string(body.Email)) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + logger.Error("failed to check for existing admin with email", zap.String("email", string(body.Email)), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if existingAdmin != nil { + logger.Debug("admin with email already exists, cannot create invite", zap.String("email", string(body.Email))) + oapi.WriteProblem(w, problem.ErrConflict(problem.Describe("an admin with that email already exists"))) + return + } + actor := rbac.FromContext(ctx) InviterAdminID := actor.ID @@ -121,6 +138,27 @@ func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http. return } + admin, err := srv.mgmt.GetAdmin(ctx, adminId) + if err != nil { + srv.logger.Error("failed to get admin", zap.String("admin_id", adminId.String()), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if admin.Email != invite.InviteeEmail { + srv.logger.Debug("admin email does not match invitee email", zap.String("admin_email", admin.Email), zap.String("invitee_email", invite.InviteeEmail)) + oapi.WriteProblem(w, problem.ErrForbidden(problem.Describe("you do not have permission to accept this invite"))) + return + } + + tx, err := srv.db.BeginTxx(ctx, nil) + if err != nil { + srv.logger.Error("failed to begin transaction", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + defer tx.Rollback() + err = srv.mgmt.AddAdminToProject(ctx, projectID, adminId, invite.Role) if err != nil { srv.logger.Error("failed to add admin to project", zap.Error(err)) @@ -132,16 +170,36 @@ func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http. invite, err = srv.mgmt.AcceptProjectInvite(ctx, token) if err != nil { - err = srv.mgmt.HardDeleteProjectAdmin(ctx, projectID, adminId) - if err != nil { - srv.logger.Error("failed to rollback project admin addition after invite acceptance failure", zap.String("project_id", projectID.String()), zap.String("admin_id", adminId.String()), zap.Error(err)) - } - srv.logger.Error("failed to accept project invite", zap.Error(err)) oapi.WriteProblem(w, err) return } + projectTouples := access.ProjectRoleTuples(adminId, projectID, "admin") + err = srv.engine.WriteTuples(ctx, projectTouples) + if err != nil { + srv.logger.Error("failed to write RBAC tuples for new project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) + return + } + + err = access.BackfillProjectTuples(ctx, srv.logger, srv.engine, srv.db) + if err != nil { + srv.logger.Error("failed to write RBAC tuples for new project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) + return + } + + err = tx.Commit() + if err != nil { + srv.logger.Error("failed to commit transaction", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("admin_id", adminId.String())) + logger.Info("accepted project invite and added admin to project") + response := invite.OAPI() json.Write(w, http.StatusOK, response) } @@ -191,7 +249,7 @@ func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.R expiresAfter = &s } - invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, expiresBefore, expiresAfter) + invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, expiresBefore, expiresAfter, params.InviterAdminId) if err != nil { logger.Error("failed to list project invites", zap.Error(err)) oapi.WriteProblem(w, err) diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index 2ea522a0..eaa4eafa 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -1783,6 +1783,13 @@ paths: type: string format: date description: Filter invites that expire before a certain date + - name: inviter_admin_id + in: query + required: false + schema: + type: string + format: uuid + description: Filter invites by the admin who created them - $ref: "#/components/parameters/Search" - $ref: "#/components/parameters/Limit" - $ref: "#/components/parameters/Offset" diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 330eef4e..9080e88f 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -2084,6 +2084,9 @@ type ListProjectInvitesParams struct { ExpiresAfter *openapi_types.Date `form:"expires_after,omitempty" json:"expires_after,omitempty"` ExpiresBefore *openapi_types.Date `form:"expires_before,omitempty" json:"expires_before,omitempty"` + // InviterAdminId Filter invites by the admin who created them + InviterAdminId *openapi_types.UUID `form:"inviter_admin_id,omitempty" json:"inviter_admin_id,omitempty"` + // Search Search query string Search *Search `form:"search,omitempty" json:"search,omitempty"` @@ -8257,6 +8260,22 @@ func NewListProjectInvitesRequest(server string, projectID openapi_types.UUID, p } + if params.InviterAdminId != nil { + + if queryFrag, err := runtime.StyleParamWithLocation("form", true, "inviter_admin_id", runtime.ParamLocationQuery, *params.InviterAdminId); err != nil { + return nil, err + } else if parsed, err := url.ParseQuery(queryFrag); err != nil { + return nil, err + } else { + for k, v := range parsed { + for _, v2 := range v { + queryValues.Add(k, v2) + } + } + } + + } + if params.Search != nil { if queryFrag, err := runtime.StyleParamWithLocation("form", true, "search", runtime.ParamLocationQuery, *params.Search); err != nil { @@ -28889,6 +28908,14 @@ func (siw *ServerInterfaceWrapper) ListProjectInvites(w http.ResponseWriter, r * return } + // ------------- Optional query parameter "inviter_admin_id" ------------- + + err = runtime.BindQueryParameter("form", true, false, "inviter_admin_id", r.URL.Query(), ¶ms.InviterAdminId) + if err != nil { + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "inviter_admin_id", Err: err}) + return + } + // ------------- Optional query parameter "search" ------------- err = runtime.BindQueryParameter("form", true, false, "search", r.URL.Query(), ¶ms.Search) diff --git a/internal/rbac/access/access.go b/internal/rbac/access/access.go index a55aa39e..6b6a1b70 100644 --- a/internal/rbac/access/access.go +++ b/internal/rbac/access/access.go @@ -30,6 +30,18 @@ func OrganizationRoleTuples(adminID, organizationID uuid.UUID, role string) []rb } } +// ProjectRoleTuples returns the tuples needed to grant the given role to an +// admin within a project. +func ProjectRoleTuples(userID, projectID uuid.UUID, role string) []rbac.Tuple { + return []rbac.Tuple{ + { + User: "user:" + userID.String(), + Relation: role, + Object: rbac.ProjectScope(projectID), + }, + } +} + // ApiKeyRoleTuples returns the tuple that grants a project-level role to an // API key. The keyID is the API key's UUID (used as the RBAC user identity) // and role must be one of "support", "client", "editor", or "admin". diff --git a/internal/store/management/invites.go b/internal/store/management/invites.go index cefb4be5..be4065ad 100644 --- a/internal/store/management/invites.go +++ b/internal/store/management/invites.go @@ -117,7 +117,7 @@ func (s *InvitesStore) RevokeProjectInvite(ctx context.Context, token string) (* return &invite, nil } -func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UUID, pagination store.Pagination, search string, role *oapi.ListProjectInvitesParamsRole, status *oapi.ListProjectInvitesParamsStatus, expiresBefore *string, expiresAfter *string) ([]Invite, int, error) { +func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UUID, pagination store.Pagination, search string, role *oapi.ListProjectInvitesParamsRole, status *oapi.ListProjectInvitesParamsStatus, expiresBefore *string, expiresAfter *string, inviterAdminID *uuid.UUID) ([]Invite, int, error) { countStmt := ` SELECT COUNT(*) FROM project_invites @@ -131,10 +131,11 @@ func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UU $4 = 'expired' AND expires_at <= NOW() AND accepted_at IS NULL AND revoked_at IS NULL )) AND ($5::date IS NULL OR expires_at >= $5::date) - AND ($6::date IS NULL OR expires_at <= $6::date)` + AND ($6::date IS NULL OR expires_at <= $6::date) + AND ($7::uuid IS NULL OR inviter_admin_id = $7::uuid)` var total int - err := s.db.GetContext(ctx, &total, countStmt, projectID, search, role, status, expiresBefore, expiresAfter) + err := s.db.GetContext(ctx, &total, countStmt, projectID, search, role, status, expiresBefore, expiresAfter, inviterAdminID) if err != nil { return nil, 0, err } @@ -154,11 +155,12 @@ func (s *InvitesStore) ListProjectInvites(ctx context.Context, projectID uuid.UU )) AND ($5::date IS NULL OR pi.expires_at >= $5::date) AND ($6::date IS NULL OR pi.expires_at <= $6::date) + AND ($7::uuid IS NULL OR pi.inviter_admin_id = $7::uuid) ORDER BY pi.created_at DESC - LIMIT $7 OFFSET $8` + LIMIT $8 OFFSET $9` var invites []Invite - err = s.db.SelectContext(ctx, &invites, stmt, projectID, search, role, status, expiresBefore, expiresAfter, pagination.Limit, pagination.Offset) + err = s.db.SelectContext(ctx, &invites, stmt, projectID, search, role, status, expiresBefore, expiresAfter, inviterAdminID, pagination.Limit, pagination.Offset) if err != nil { return nil, 0, err } From d3d41d0b07ce5fa14f9ba0f170293698dc187fee Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Tue, 28 Apr 2026 14:48:28 +0200 Subject: [PATCH 07/22] feat: update project invite roles and permissions, enhance role hierarchy logic Co-authored-by: Copilot --- console/src/oapi/management.generated.ts | 4 +- console/src/types.ts | 2 +- console/src/views/settings/InviteDialog.tsx | 64 +++++++++++-------- console/src/views/settings/Invites.tsx | 7 +- .../controllers/v1/management/campaigns.go | 2 +- .../http/controllers/v1/management/invites.go | 32 ++++++++++ .../controllers/v1/management/journeys.go | 2 +- .../http/controllers/v1/management/lists.go | 2 +- .../http/controllers/v1/management/locales.go | 8 +-- .../v1/management/oapi/resources.yml | 4 +- .../v1/management/oapi/resources_gen.go | 16 ++--- .../controllers/v1/management/projects.go | 38 +++++++++-- .../v1/management/push_providers.go | 6 +- .../v1/management/sender_identities.go | 8 +-- internal/pubsub/consumer/campaigns.go | 2 +- internal/store/management/projects.go | 56 ++++++++++++++-- internal/store/management/projects_test.go | 4 +- 17 files changed, 191 insertions(+), 66 deletions(-) diff --git a/console/src/oapi/management.generated.ts b/console/src/oapi/management.generated.ts index c3e61e4b..a90761eb 100644 --- a/console/src/oapi/management.generated.ts +++ b/console/src/oapi/management.generated.ts @@ -4727,7 +4727,7 @@ export interface components { * @example admin * @enum {string} */ - role: "owner" | "admin" | "editor" | "viewer"; + role: "owner" | "admin" | "editor" | "support"; /** * @description Duration until the invite expires (e.g. "24h", "7d"). Optional, defaults to 24 hours. * @example 24h @@ -4761,7 +4761,7 @@ export interface components { * @example admin * @enum {string} */ - role?: "owner" | "admin" | "editor" | "viewer"; + role?: "owner" | "admin" | "editor" | "support"; /** * @description Unique token for the invite link * @example a1b2c3d4e5f6a1b2c3d4 diff --git a/console/src/types.ts b/console/src/types.ts index 81f1b057..89706273 100644 --- a/console/src/types.ts +++ b/console/src/types.ts @@ -330,7 +330,7 @@ export interface Admin { role: OrganizationRole } -export const projectRoles = ["support", "client", "editor", "admin"] as const +export const projectRoles = ["support", "client", "editor", "admin", "owner"] as const export interface ProjectInvite { id: UUID diff --git a/console/src/views/settings/InviteDialog.tsx b/console/src/views/settings/InviteDialog.tsx index 38a745ad..2b2a9f31 100644 --- a/console/src/views/settings/InviteDialog.tsx +++ b/console/src/views/settings/InviteDialog.tsx @@ -5,6 +5,22 @@ import { snakeToTitle } from "../../utils" import type { ProjectRole } from "../../types" import { projectRoles } from "../../types" +const roleHierarchy: Record = { + support: 1, + client: 1, + editor: 2, + admin: 3, + owner: 4, +} + +function getAllowedRoles(userRole: ProjectRole): ProjectRole[] { + const userLevel = roleHierarchy[userRole] ?? 0 + console.log("User role:", userRole, "User level:", userLevel) + return projectRoles.filter( + (role) => role !== "owner" && (roleHierarchy[role] ?? 0) <= userLevel, + ) +} + import { Button } from "@/components/ui/button" import { Input } from "@/components/ui/input" import { Label } from "@/components/ui/label" @@ -43,15 +59,6 @@ const roleConfig: Record< "Designed for client-side SDKs and public integrations", ], }, - viewer: { - icon: Eye, - description: "View-only access to project data.", - permissions: [ - "View users, campaigns, journeys, templates", - "View events, lists, tags, and documents", - "No create, update, or delete access", - ], - }, editor: { icon: Pencil, description: "Full content management for campaigns, journeys, and more.", @@ -93,18 +100,27 @@ export interface InviteDialogProps { onClose: () => void onSave: (data: InviteFormData) => Promise isSaving: boolean + userRole?: ProjectRole } -export default function InviteDialog({ isOpen, onClose, onSave, isSaving }: InviteDialogProps) { +export default function InviteDialog({ + isOpen, + onClose, + onSave, + isSaving, + userRole = "support", +}: InviteDialogProps) { const { t } = useTranslation() + const allowedRoles = getAllowedRoles(userRole) const form = useForm({ values: { - role: "admin", + role: allowedRoles.includes("admin") ? "admin" : allowedRoles[0] || "support", + email: "", expires_in: "24h", }, }) - const selectedRole = form.watch("role") ?? "admin" + const selectedRole = form.watch("role") ?? allowedRoles[0] const expiresIn = form.watch("expires_in") ?? "24h" const expiryOptions = [ @@ -115,7 +131,7 @@ export default function InviteDialog({ isOpen, onClose, onSave, isSaving }: Invi { value: "30d", label: "30 days" }, ] - const validRoles = projectRoles.filter((role) => role !== "owner") + const validRoles = allowedRoles return ( form.setValue("role", role as ProjectRole)} + onClick={() => form.setValue("role", role)} className={`relative flex flex-col gap-1.5 rounded-lg border p-3 text-left text-sm transition-colors hover:bg-accent/50 ${ isSelected ? "border-primary bg-primary/5 ring-1 ring-primary" @@ -211,17 +227,15 @@ export default function InviteDialog({ isOpen, onClose, onSave, isSaving }: Invi {snakeToTitle(selectedRole)} {t("permissions", "permissions")}

    - {roleConfig[selectedRole as ProjectRole]?.permissions.map( - (perm) => ( -
  • - - {perm} -
  • - ), - )} + {roleConfig[selectedRole]?.permissions.map((perm) => ( +
  • + + {perm} +
  • + ))}
diff --git a/console/src/views/settings/Invites.tsx b/console/src/views/settings/Invites.tsx index fd7960d2..8fa5134e 100644 --- a/console/src/views/settings/Invites.tsx +++ b/console/src/views/settings/Invites.tsx @@ -55,6 +55,7 @@ import { export default function Invites() { const { t } = useTranslation() const [project] = useContext(ProjectContext) + console.log(project) const [searchQuery, setSearchQuery] = useState("") const [debouncedQuery, setDebouncedQuery] = useState("") @@ -113,7 +114,8 @@ export default function Invites() { setPage(1) }, []) - const hasActiveFilters = statusFilter || roleFilter || expiresAfter || expiresBefore || inviterAdminFilter + const hasActiveFilters = + statusFilter || roleFilter || expiresAfter || expiresBefore || inviterAdminFilter const [adminsResult] = useResolver( useCallback(async () => { @@ -191,7 +193,7 @@ export default function Invites() { return { status: "pending", icon: Clock, className: "text-blue-500" } } - const canCreateInvite = project.role === "admin" + const canCreateInvite = ["editor", "admin", "owner"].includes(project.role ?? "") return (
@@ -613,6 +615,7 @@ export default function Invites() { } }} isSaving={isSaving} + userRole={project.role} />
) diff --git a/internal/http/controllers/v1/management/campaigns.go b/internal/http/controllers/v1/management/campaigns.go index 2098efae..6cadc2e6 100644 --- a/internal/http/controllers/v1/management/campaigns.go +++ b/internal/http/controllers/v1/management/campaigns.go @@ -53,7 +53,7 @@ func (srv *CampaignsController) CreateCampaign(w http.ResponseWriter, r *http.Re logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("channel", string(body.Channel))) logger.Info("creating campaign") - project, err := srv.mgmt.ProjectsStore.GetProject(ctx, projectID) + project, err := srv.mgmt.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index a1b15ce3..9385ceb3 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -42,6 +42,18 @@ func randomString(n int) string { return base64.URLEncoding.EncodeToString(b)[:n] } +func isRoleHigher(role1, role2 string) bool { + roleHierarchy := map[string]int{ + "support": 1, + "client": 1, + "editor": 2, + "admin": 3, + "owner": 4, + } + + return roleHierarchy[role1] > roleHierarchy[role2] +} + func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID) { ctx := r.Context() err := srv.engine.Allowed(ctx, rbac.Create, rbac.ProjectResourceScope("invites", projectID)) @@ -76,6 +88,26 @@ func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http. actor := rbac.FromContext(ctx) InviterAdminID := actor.ID + actorAdmin, err := srv.mgmt.GetAdmin(ctx, uuid.MustParse(InviterAdminID)) + if err != nil { + logger.Error("failed to get inviter admin details", zap.String("admin_id", InviterAdminID), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if actorAdmin.Email == string(body.Email) { + logger.Debug("inviter email matches invitee email, cannot create invite", zap.String("email", string(body.Email))) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("you cannot invite yourself to a project"))) + return + } + + actorRole := actorAdmin.Role + if actorRole != "" && isRoleHigher(string(body.Role), actorRole) { + logger.Debug("invite role is higher than existing admin role, cannot create invite", zap.String("email", string(body.Email)), zap.String("invite_role", string(body.Role)), zap.String("existing_role", actorRole)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("the role assigned by this invite must be equal to or lower than the existing global role of the admin with the same email"))) + return + } + // at 1 billion invite tokens (~200GB of data), the probability of a collision // is 10^-102%, a decimal point followed by 101 zeroes and a 1. if every atom // in the observable universe (2^266) was an invite token, it'd still only be diff --git a/internal/http/controllers/v1/management/journeys.go b/internal/http/controllers/v1/management/journeys.go index 0f1d0d2c..9437cbe6 100644 --- a/internal/http/controllers/v1/management/journeys.go +++ b/internal/http/controllers/v1/management/journeys.go @@ -121,7 +121,7 @@ func (srv *JourneysController) CreateJourney(w http.ResponseWriter, r *http.Requ logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("name", body.Name)) logger.Info("creating journey") - project, err := srv.mgmt.GetProject(ctx, projectID) + project, err := srv.mgmt.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/lists.go b/internal/http/controllers/v1/management/lists.go index 6e7bcdc8..3864f541 100644 --- a/internal/http/controllers/v1/management/lists.go +++ b/internal/http/controllers/v1/management/lists.go @@ -64,7 +64,7 @@ func (srv *ListsController) CreateList(w http.ResponseWriter, r *http.Request, p logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("name", body.Name)) logger.Info("creating list") - _, err = srv.projects.GetProject(ctx, projectID) + _, err = srv.projects.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/locales.go b/internal/http/controllers/v1/management/locales.go index d5bff779..beb09e70 100644 --- a/internal/http/controllers/v1/management/locales.go +++ b/internal/http/controllers/v1/management/locales.go @@ -65,7 +65,7 @@ func (srv *LocalesController) CreateLocale(w http.ResponseWriter, r *http.Reques logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("key", body.Key)) logger.Info("creating locale") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -114,7 +114,7 @@ func (srv *LocalesController) ListLocales(w http.ResponseWriter, r *http.Request logger := srv.logger.With(zap.Stringer("project_id", projectID)) logger.Info("listing locales") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -167,7 +167,7 @@ func (srv *LocalesController) GetLocale(w http.ResponseWriter, r *http.Request, logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("locale_id", localeID)) logger.Info("getting locale") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -207,7 +207,7 @@ func (srv *LocalesController) DeleteLocale(w http.ResponseWriter, r *http.Reques logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.Stringer("locale_id", localeID)) logger.Info("deleting locale") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index eaa4eafa..893d05ec 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -9106,7 +9106,7 @@ components: example: "user@example.com" role: type: string - enum: [owner, admin, editor, viewer] + enum: [owner, admin, editor, support] example: admin expires_in: type: string @@ -9138,7 +9138,7 @@ components: example: "user@example.com" role: type: string - enum: [owner, admin, editor, viewer] + enum: [owner, admin, editor, support] example: admin token: type: string diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 9080e88f..5e0e47cb 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -65,10 +65,10 @@ const ( // Defines values for CreateProjectInviteRole. const ( - CreateProjectInviteRoleAdmin CreateProjectInviteRole = "admin" - CreateProjectInviteRoleEditor CreateProjectInviteRole = "editor" - CreateProjectInviteRoleOwner CreateProjectInviteRole = "owner" - CreateProjectInviteRoleViewer CreateProjectInviteRole = "viewer" + CreateProjectInviteRoleAdmin CreateProjectInviteRole = "admin" + CreateProjectInviteRoleEditor CreateProjectInviteRole = "editor" + CreateProjectInviteRoleOwner CreateProjectInviteRole = "owner" + CreateProjectInviteRoleSupport CreateProjectInviteRole = "support" ) // Defines values for CreateScheduleOffsetRequestDirection. @@ -135,10 +135,10 @@ const ( // Defines values for ProjectInviteRole. const ( - ProjectInviteRoleAdmin ProjectInviteRole = "admin" - ProjectInviteRoleEditor ProjectInviteRole = "editor" - ProjectInviteRoleOwner ProjectInviteRole = "owner" - ProjectInviteRoleViewer ProjectInviteRole = "viewer" + ProjectInviteRoleAdmin ProjectInviteRole = "admin" + ProjectInviteRoleEditor ProjectInviteRole = "editor" + ProjectInviteRoleOwner ProjectInviteRole = "owner" + ProjectInviteRoleSupport ProjectInviteRole = "support" ) // Defines values for ProjectPushProviderPlatform. diff --git a/internal/http/controllers/v1/management/projects.go b/internal/http/controllers/v1/management/projects.go index 9c6817ec..14d11114 100644 --- a/internal/http/controllers/v1/management/projects.go +++ b/internal/http/controllers/v1/management/projects.go @@ -91,7 +91,14 @@ func (srv *ProjectsController) ListProjects(w http.ResponseWriter, r *http.Reque search = string(*params.Search) } - projects, total, err := srv.store.ListProjects(ctx, actor.OrganizationID, pagination, search) + actorID, err := uuid.Parse(actor.ID) + if err != nil { + logger.Error("failed to parse actor ID as UUID", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + projects, total, err := srv.store.ListProjectsForAdmin(ctx, actorID, pagination, search) if err != nil { logger.Error("failed to list projects", zap.Error(err)) oapi.WriteProblem(w, err) @@ -123,7 +130,14 @@ func (srv *ProjectsController) GetProject(w http.ResponseWriter, r *http.Request logger := srv.logger.With(zap.Stringer("project_id", projectID)) - project, err := srv.store.GetProject(ctx, projectID) + actorID, err := uuid.Parse(actor.ID) + if err != nil { + logger.Error("failed to parse actor ID as UUID", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + project, err := srv.store.GetProject(ctx, projectID, &actorID) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -275,8 +289,15 @@ func (srv *ProjectsController) CreateProject(w http.ResponseWriter, r *http.Requ return } + actorID, err := uuid.Parse(actor.ID) + if err != nil { + logger.Error("failed to parse actor ID as UUID", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + logger.Info("project created", zap.Stringer("project_id", projectID)) - project, err := srv.store.GetProject(ctx, projectID) + project, err := srv.store.GetProject(ctx, projectID, &actorID) if err != nil { logger.Error("failed to fetch created project", zap.Error(err)) oapi.WriteProblem(w, err) @@ -337,7 +358,14 @@ func (srv *ProjectsController) UpdateProject(w http.ResponseWriter, r *http.Requ return } - project, err := srv.store.GetProject(ctx, projectID) + actorID, err := uuid.Parse(actor.ID) + if err != nil { + logger.Error("failed to parse actor ID as UUID", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + project, err := srv.store.GetProject(ctx, projectID, &actorID) if err != nil { logger.Error("failed to fetch updated project", zap.Error(err)) oapi.WriteProblem(w, err) @@ -362,7 +390,7 @@ func (srv *ProjectsController) DeleteProject(w http.ResponseWriter, r *http.Requ logger := srv.logger.With(zap.Stringer("project_id", projectID)) logger.Info("deleting project") - _, err = srv.store.GetProject(ctx, projectID) + _, err = srv.store.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/push_providers.go b/internal/http/controllers/v1/management/push_providers.go index 2cc5dcc7..2163e1b9 100644 --- a/internal/http/controllers/v1/management/push_providers.go +++ b/internal/http/controllers/v1/management/push_providers.go @@ -56,7 +56,7 @@ func (srv *PushProvidersController) ListProjectPushProviders(w http.ResponseWrit logger.Info("listing project push providers") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -111,7 +111,7 @@ func (srv *PushProvidersController) UpsertProjectPushProvider(w http.ResponseWri logger = logger.With(zap.Stringer("provider_id", body.ProviderId)) logger.Info("upserting project push provider") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -184,7 +184,7 @@ func (srv *PushProvidersController) DeleteProjectPushProvider(w http.ResponseWri logger.Info("deleting project push provider") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/http/controllers/v1/management/sender_identities.go b/internal/http/controllers/v1/management/sender_identities.go index 82001576..171ad3cf 100644 --- a/internal/http/controllers/v1/management/sender_identities.go +++ b/internal/http/controllers/v1/management/sender_identities.go @@ -67,7 +67,7 @@ func (srv *SenderIdentitiesController) CreateSenderIdentity(w http.ResponseWrite logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.String("address", address), zap.String("channel", string(body.Channel)), zap.Stringer("provider_id", body.ProviderId)) logger.Info("creating sender identity") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -141,7 +141,7 @@ func (srv *SenderIdentitiesController) ListSenderIdentities(w http.ResponseWrite logger := srv.logger.With(zap.Stringer("project_id", projectID)) logger.Info("listing sender identities") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -203,7 +203,7 @@ func (srv *SenderIdentitiesController) GetSenderIdentity(w http.ResponseWriter, logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.Stringer("sender_identity_id", senderIdentityID)) logger.Info("getting sender identity") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) @@ -241,7 +241,7 @@ func (srv *SenderIdentitiesController) DeleteSenderIdentity(w http.ResponseWrite logger := srv.logger.With(zap.Stringer("project_id", projectID), zap.Stringer("sender_identity_id", senderIdentityID)) logger.Info("deleting sender identity") - _, err = srv.store.ProjectsStore.GetProject(ctx, projectID) + _, err = srv.store.ProjectsStore.GetProject(ctx, projectID, nil) if errors.Is(err, sql.ErrNoRows) { logger.Info("project not found", zap.Stringer("project_id", projectID)) oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project not found"))) diff --git a/internal/pubsub/consumer/campaigns.go b/internal/pubsub/consumer/campaigns.go index 5ac0559f..94bd620d 100644 --- a/internal/pubsub/consumer/campaigns.go +++ b/internal/pubsub/consumer/campaigns.go @@ -159,7 +159,7 @@ func CampaignsSendHandler(logger *zap.Logger, mgmt *management.State, usrs *subj } } - project, err := mgmt.GetProject(ctx, event.ProjectID) + project, err := mgmt.GetProject(ctx, event.ProjectID, nil) if err != nil { logger.Error("failed to get project", zap.Error(err)) return err diff --git a/internal/store/management/projects.go b/internal/store/management/projects.go index fc56386d..2c4bcc41 100644 --- a/internal/store/management/projects.go +++ b/internal/store/management/projects.go @@ -18,6 +18,7 @@ type Project struct { TextOptOutMessage *string `db:"text_opt_out_message"` TextHelpMessage *string `db:"text_help_message"` Locale string `db:"locale"` + Role string `db:"role"` IntegrationsCount int `db:"integrations_count"` CampaignsCount int `db:"campaigns_count"` JourneysCount int `db:"journeys_count"` @@ -28,6 +29,10 @@ type Project struct { } func (p *Project) OAPI() oapi.Project { + if p.Role == "" { + p.Role = "viewer" + } + project := oapi.Project{ Id: p.ID, Name: p.Name, @@ -38,7 +43,7 @@ func (p *Project) OAPI() oapi.Project { JourneysCount: &p.JourneysCount, UsersCount: &p.UsersCount, ListsCount: &p.ListsCount, - Role: "admin", // NOTE: we hardcode this for now; this has to be refactored later when we are addressing RBAC, the role is right now checked in the controller + Role: p.Role, CreatedAt: p.CreatedAt, UpdatedAt: p.UpdatedAt, } @@ -85,11 +90,12 @@ func (s *ProjectsStore) CreateProject(ctx context.Context, project Project) (uui return id, nil } -func (s *ProjectsStore) GetProject(ctx context.Context, id uuid.UUID) (*Project, error) { +func (s *ProjectsStore) GetProject(ctx context.Context, id uuid.UUID, adminID *uuid.UUID) (*Project, error) { query := ` SELECT id, organization_id, name, description, timezone, text_opt_out_message, text_help_message, locale, created_at, updated_at, COALESCE(pr.integrations_count, 0) AS integrations_count, - COALESCE(ca.campaigns_count, 0) AS campaigns_count + COALESCE(ca.campaigns_count, 0) AS campaigns_count, + pa.role AS role FROM projects LEFT JOIN ( SELECT project_id, COUNT(*) AS integrations_count @@ -103,11 +109,16 @@ func (s *ProjectsStore) GetProject(ctx context.Context, id uuid.UUID) (*Project, WHERE deleted_at IS NULL GROUP BY project_id ) ca ON ca.project_id = projects.id + LEFT JOIN ( + SELECT project_id, role + FROM project_admins + WHERE $2::uuid IS NOT NULL AND admin_id = $2 AND deleted_at IS NULL + ) pa ON pa.project_id = projects.id WHERE id = $1 AND deleted_at IS NULL` var project Project - err := s.db.GetContext(ctx, &project, query, id) + err := s.db.GetContext(ctx, &project, query, id, adminID) if err != nil { return nil, err } @@ -152,6 +163,43 @@ func (s *ProjectsStore) ListProjects(ctx context.Context, organizationID uuid.UU return projects, results[0].TotalCount, nil } +func (s *ProjectsStore) ListProjectsForAdmin(ctx context.Context, adminID uuid.UUID, pagination store.Pagination, search string) ([]Project, int, error) { + // TODO: include counts as in GetProject + query := ` + SELECT p.id, p.name, p.timezone, p.text_help_message, p.locale, + p.created_at, p.updated_at, + pa.role, + COUNT(*) OVER() AS total_count + FROM projects p + JOIN project_admins pa ON pa.project_id = p.id AND pa.admin_id = $1 AND pa.deleted_at IS NULL + WHERE p.deleted_at IS NULL + AND ($2 = '' OR p.name ILIKE '%' || $2 || '%') + ORDER BY p.created_at DESC + LIMIT $3 OFFSET $4` + + type result struct { + Project + TotalCount int `db:"total_count"` + } + + var results []result + err := s.db.SelectContext(ctx, &results, query, adminID, search, pagination.Limit, pagination.Offset) + if err != nil { + return nil, 0, err + } + + if len(results) == 0 { + return []Project{}, 0, nil + } + + projects := make([]Project, len(results)) + for i, r := range results { + projects[i] = r.Project + } + + return projects, results[0].TotalCount, nil +} + type ProjectUpdate struct { Name *string Description *string diff --git a/internal/store/management/projects_test.go b/internal/store/management/projects_test.go index 8488dbef..237fdf73 100644 --- a/internal/store/management/projects_test.go +++ b/internal/store/management/projects_test.go @@ -28,7 +28,7 @@ func TestProjectsStore(t *testing.T) { require.NoError(t, err) assert.NotEqual(t, uuid.Nil, projectID) - project, err := db.GetProject(ctx, projectID) + project, err := db.GetProject(ctx, projectID, nil) require.NoError(t, err) assert.Equal(t, "Test Project", project.Name) assert.Equal(t, "UTC", project.Timezone) @@ -51,7 +51,7 @@ func TestProjectsStore(t *testing.T) { }) require.NoError(t, err) - project, err := db.GetProject(ctx, projectID) + project, err := db.GetProject(ctx, projectID, nil) require.NoError(t, err) assert.Equal(t, "Updated Name", project.Name) assert.Equal(t, "America/New_York", project.Timezone) From c9887243d5ce434dcde3931391bcb19ec7716738 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Tue, 28 Apr 2026 15:06:43 +0200 Subject: [PATCH 08/22] feat: update project roles and permissions, remove owner role from certain contexts Co-authored-by: Copilot --- console/src/types.ts | 3 +- console/src/views/invites/AcceptInvite.tsx | 49 ++++++++++++++++----- console/src/views/settings/ApiKeyDialog.tsx | 9 +--- console/src/views/settings/ApiKeys.tsx | 6 +-- console/src/views/settings/InviteDialog.tsx | 13 +----- 5 files changed, 45 insertions(+), 35 deletions(-) diff --git a/console/src/types.ts b/console/src/types.ts index 89706273..765312ce 100644 --- a/console/src/types.ts +++ b/console/src/types.ts @@ -330,7 +330,8 @@ export interface Admin { role: OrganizationRole } -export const projectRoles = ["support", "client", "editor", "admin", "owner"] as const +export const projectRolesIncludingOwner = ["support", "client", "editor", "admin", "owner"] as const +export const projectRoles = ["support", "client", "editor", "admin"] as const export interface ProjectInvite { id: UUID diff --git a/console/src/views/invites/AcceptInvite.tsx b/console/src/views/invites/AcceptInvite.tsx index 089a3616..8a061bcc 100644 --- a/console/src/views/invites/AcceptInvite.tsx +++ b/console/src/views/invites/AcceptInvite.tsx @@ -6,7 +6,7 @@ import { Loader2, Mail, ShieldAlert } from "lucide-react" import api from "../../api" import oapiClient from "../../oapi/client" import { AUTH_DRIVERS } from "../../types" -import type { ProjectInvite, AuthDriver } from "../../types" +import type { ProjectInvite, AuthDriver, Admin } from "../../types" import { Button } from "@/components/ui/button" import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card" @@ -60,7 +60,13 @@ export default function AcceptInvite() { navigate(`/projects/${invite.project_id}`) }, 1200) } catch { - setState({ status: "error", message: t("invite_accept_failed", "Failed to accept the invite. Please try again.") }) + setState({ + status: "error", + message: t( + "invite_accept_failed", + "Failed to accept the invite. Please try again.", + ), + }) } }, [token, navigate, t], @@ -74,17 +80,26 @@ export default function AcceptInvite() { }) if (error || !invite) { - setState({ status: "error", message: t("invite_not_found", "This invite link is invalid or has expired.") }) + setState({ + status: "error", + message: t("invite_not_found", "This invite link is invalid or has expired."), + }) return } if (invite.accepted_at) { - setState({ status: "error", message: t("invite_already_accepted", "This invite has already been accepted.") }) + setState({ + status: "error", + message: t("invite_already_accepted", "This invite has already been accepted."), + }) return } if (invite.revoked_at) { - setState({ status: "error", message: t("invite_revoked", "This invite has been revoked.") }) + setState({ + status: "error", + message: t("invite_revoked", "This invite has been revoked."), + }) return } @@ -96,9 +111,7 @@ export default function AcceptInvite() { const profile = profileResult.status === "fulfilled" ? profileResult.value : null const drivers = - driversResult.status === "fulfilled" - ? driversResult.value - : [AUTH_DRIVERS.BASIC] + driversResult.status === "fulfilled" ? driversResult.value : [AUTH_DRIVERS.BASIC] if (!profile) { // Not logged in @@ -184,13 +197,18 @@ export default function AcceptInvite() {
- {t("invite_wrong_account_title", "Wrong account")} + + {t("invite_wrong_account_title", "Wrong account")} + - {t("invite_wrong_account", "This invite was not sent to your account. Please log out and sign in with the correct account.")} + {t( + "invite_wrong_account", + "This invite was not sent to your account. Please log out and sign in with the correct account.", + )} @@ -211,7 +229,10 @@ export default function AcceptInvite() { {t("invite_title", "You've been invited")} - {t("invite_sign_in_prompt", "Sign in or create an account to accept this invite.")} + {t( + "invite_sign_in_prompt", + "Sign in or create an account to accept this invite.", + )} @@ -222,7 +243,11 @@ export default function AcceptInvite() { {t("login")} {hasClerk && ( - )} diff --git a/console/src/views/settings/ApiKeyDialog.tsx b/console/src/views/settings/ApiKeyDialog.tsx index cbcca070..5207b059 100644 --- a/console/src/views/settings/ApiKeyDialog.tsx +++ b/console/src/views/settings/ApiKeyDialog.tsx @@ -78,7 +78,7 @@ export default function ApiKeyDialog({ editing, onClose, onSave, isSaving }: Api }) // eslint-disable-next-line react-hooks/incompatible-library - const selectedRole = form.watch("role") ?? "support" + const selectedRole = form.watch("role") ?? "client" const isUpdate = !!editing?.id return ( @@ -134,12 +134,7 @@ export default function ApiKeyDialog({ editing, onClose, onSave, isSaving }: Api
- - - - ) + return ( +
+ + + + {t("invite_title", "You've been invited")} + + + {t( + "invite_review_prompt", + "Review the details below and accept to join.", + )} + + + + + + + +
+ ) + } else { + return + } } function InviteDetails({ invite }: { invite: ProjectInvite }) { diff --git a/console/src/views/settings/Invites.tsx b/console/src/views/settings/Invites.tsx index 16a48f10..f19e8b00 100644 --- a/console/src/views/settings/Invites.tsx +++ b/console/src/views/settings/Invites.tsx @@ -179,36 +179,6 @@ export default function Invites() { }) } - const mashTokenNonce = (nonce: string, token: string) => { - try { - const nonceBytes = Uint8Array.from( - atob(nonce.replace(/-/g, "+").replace(/_/g, "/")), - (c) => c.charCodeAt(0), - ) - const tokenBytes = Uint8Array.from( - atob(token.replace(/-/g, "+").replace(/_/g, "/")), - (c) => c.charCodeAt(0), - ) - - console.log("nonceBytes", nonceBytes) - console.log("tokenBytes", tokenBytes) - - const mashed = new Uint8Array(nonceBytes.length + tokenBytes.length) - mashed.set(nonceBytes) - mashed.set(tokenBytes, nonceBytes.length) - - console.log("mashed", mashed, "mashed.length", mashed.length) - - return btoa(String.fromCharCode(...mashed)) - .replace(/\+/g, "-") - .replace(/\//g, "_") - .replace(/=/g, "") - } catch (e) { - console.error("mash failed", e) - return nonce + token - } - } - const getInviteStatus = (invite: ProjectInvite) => { if (invite.revoked_at) { return { status: "revoked", icon: XCircle, className: "text-red-500" } @@ -516,10 +486,7 @@ export default function Invites() { onClick={async (e) => { e.stopPropagation() await handleCopyLink( - mashTokenNonce( - invite.nonce, - invite.token, - ), + `${invite.nonce}${invite.token}`, ) }} > @@ -534,10 +501,7 @@ export default function Invites() { onClick={async (e) => { e.stopPropagation() await handleRevoke( - mashTokenNonce( - invite.nonce, - invite.token, - ), + `${invite.nonce}${invite.token}`, ) }} > @@ -648,7 +612,7 @@ export default function Invites() { const invite = await api.invites.create(project.id, data) await reload() setIsCreating(false) - setCreatedInviteToken(mashTokenNonce(invite.nonce, invite.token)) + setCreatedInviteToken(`${invite.nonce}${invite.token}`) } finally { setIsSaving(false) } diff --git a/internal/http/console/dist/index.html b/internal/http/console/dist/index.html index 98cf490b..9836c5e0 100644 --- a/internal/http/console/dist/index.html +++ b/internal/http/console/dist/index.html @@ -21,8 +21,8 @@ Lunogram - - + + diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index eab9e038..f335e452 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -247,7 +247,7 @@ func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Req encryptedToken, nonce, err := unpackToken(encryptionPair, srv.cfg.SecretKey, srv.logger) if err != nil { srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", encryptionPair), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) return } @@ -257,7 +257,7 @@ func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Req token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) if err != nil { srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) return } @@ -285,18 +285,18 @@ func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Req json.Write(w, http.StatusOK, response) } -func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, tokenNouncePair string) { +func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, token string) { ctx := r.Context() actor := rbac.FromContext(ctx) - encryptedToken, nonce, err := unpackToken(tokenNouncePair, srv.cfg.SecretKey, srv.logger) + encryptedToken, nonce, err := unpackToken(token, srv.cfg.SecretKey, srv.logger) if err != nil { - srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", tokenNouncePair), zap.Error(err)) + srv.logger.Error("failed to expand token and nonce", zap.String("token", token), zap.Error(err)) oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) return } - token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) + token, _, err = encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) if err != nil { srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) diff --git a/internal/http/controllers/v1/management/oapi/resources.yml b/internal/http/controllers/v1/management/oapi/resources.yml index e0357785..8bf8f8af 100644 --- a/internal/http/controllers/v1/management/oapi/resources.yml +++ b/internal/http/controllers/v1/management/oapi/resources.yml @@ -1799,7 +1799,7 @@ paths: default: $ref: "#/components/responses/Error" - /api/admin/projects/{projectID}/invites/accept/{tokenNouncePair}: + /api/admin/projects/{projectID}/invites/accept/{token}: post: summary: Accept a project invite description: Accepts a project invite using the invite token and nonce, associating the authenticated admin with the project @@ -1809,7 +1809,7 @@ paths: security: - HttpBearerAuth: [] parameters: - - name: tokenNouncePair + - name: token in: path required: true schema: @@ -8185,7 +8185,7 @@ components: ProjectPushProviderPlatform: type: string - enum: [ios, android, web, email] + enum: [ios, android, web, mail] description: Target platform for providers (push or mail) example: ios diff --git a/internal/http/controllers/v1/management/oapi/resources_gen.go b/internal/http/controllers/v1/management/oapi/resources_gen.go index 1e47820f..f44e13fd 100644 --- a/internal/http/controllers/v1/management/oapi/resources_gen.go +++ b/internal/http/controllers/v1/management/oapi/resources_gen.go @@ -144,8 +144,8 @@ const ( // Defines values for ProjectPushProviderPlatform. const ( ProjectPushProviderPlatformAndroid ProjectPushProviderPlatform = "android" - ProjectPushProviderPlatformEmail ProjectPushProviderPlatform = "email" ProjectPushProviderPlatformIos ProjectPushProviderPlatform = "ios" + ProjectPushProviderPlatformMail ProjectPushProviderPlatform = "mail" ProjectPushProviderPlatformWeb ProjectPushProviderPlatform = "web" ) @@ -2778,7 +2778,7 @@ type ClientInterface interface { CreateProjectInvite(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*http.Response, error) // AcceptProjectInvite request - AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*http.Response, error) + AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) // RevokeProjectInvite request RevokeProjectInvite(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*http.Response, error) @@ -3940,8 +3940,8 @@ func (c *Client) CreateProjectInvite(ctx context.Context, projectID openapi_type return c.Client.Do(req) } -func (c *Client) AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*http.Response, error) { - req, err := NewAcceptProjectInviteRequest(c.Server, projectID, tokenNouncePair) +func (c *Client) AcceptProjectInvite(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*http.Response, error) { + req, err := NewAcceptProjectInviteRequest(c.Server, projectID, token) if err != nil { return nil, err } @@ -8387,7 +8387,7 @@ func NewCreateProjectInviteRequestWithBody(server string, projectID openapi_type } // NewAcceptProjectInviteRequest generates requests for AcceptProjectInvite -func NewAcceptProjectInviteRequest(server string, projectID openapi_types.UUID, tokenNouncePair string) (*http.Request, error) { +func NewAcceptProjectInviteRequest(server string, projectID openapi_types.UUID, token string) (*http.Request, error) { var err error var pathParam0 string @@ -8399,7 +8399,7 @@ func NewAcceptProjectInviteRequest(server string, projectID openapi_types.UUID, var pathParam1 string - pathParam1, err = runtime.StyleParamWithLocation("simple", false, "tokenNouncePair", runtime.ParamLocationPath, tokenNouncePair) + pathParam1, err = runtime.StyleParamWithLocation("simple", false, "token", runtime.ParamLocationPath, token) if err != nil { return nil, err } @@ -14462,7 +14462,7 @@ type ClientWithResponsesInterface interface { CreateProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, body CreateProjectInviteJSONRequestBody, reqEditors ...RequestEditorFn) (*CreateProjectInviteResponse, error) // AcceptProjectInviteWithResponse request - AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) + AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) // RevokeProjectInviteWithResponse request RevokeProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*RevokeProjectInviteResponse, error) @@ -19120,8 +19120,8 @@ func (c *ClientWithResponses) CreateProjectInviteWithResponse(ctx context.Contex } // AcceptProjectInviteWithResponse request returning *AcceptProjectInviteResponse -func (c *ClientWithResponses) AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, tokenNouncePair string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) { - rsp, err := c.AcceptProjectInvite(ctx, projectID, tokenNouncePair, reqEditors...) +func (c *ClientWithResponses) AcceptProjectInviteWithResponse(ctx context.Context, projectID openapi_types.UUID, token string, reqEditors ...RequestEditorFn) (*AcceptProjectInviteResponse, error) { + rsp, err := c.AcceptProjectInvite(ctx, projectID, token, reqEditors...) if err != nil { return nil, err } @@ -25595,8 +25595,8 @@ type ServerInterface interface { // (POST /api/admin/projects/{projectID}/invites) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID) // Accept a project invite - // (POST /api/admin/projects/{projectID}/invites/accept/{tokenNouncePair}) - AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, tokenNouncePair string) + // (POST /api/admin/projects/{projectID}/invites/accept/{token}) + AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) // Revoke a project invite // (DELETE /api/admin/projects/{projectID}/invites/{tokenNouncePair}) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, tokenNouncePair string) @@ -26225,8 +26225,8 @@ func (_ Unimplemented) CreateProjectInvite(w http.ResponseWriter, r *http.Reques } // Accept a project invite -// (POST /api/admin/projects/{projectID}/invites/accept/{tokenNouncePair}) -func (_ Unimplemented) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, tokenNouncePair string) { +// (POST /api/admin/projects/{projectID}/invites/accept/{token}) +func (_ Unimplemented) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID openapi_types.UUID, token string) { w.WriteHeader(http.StatusNotImplemented) } @@ -29000,12 +29000,12 @@ func (siw *ServerInterfaceWrapper) AcceptProjectInvite(w http.ResponseWriter, r return } - // ------------- Path parameter "tokenNouncePair" ------------- - var tokenNouncePair string + // ------------- Path parameter "token" ------------- + var token string - err = runtime.BindStyledParameterWithOptions("simple", "tokenNouncePair", chi.URLParam(r, "tokenNouncePair"), &tokenNouncePair, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) + err = runtime.BindStyledParameterWithOptions("simple", "token", chi.URLParam(r, "token"), &token, runtime.BindStyledParameterOptions{ParamLocation: runtime.ParamLocationPath, Explode: false, Required: true}) if err != nil { - siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "tokenNouncePair", Err: err}) + siw.ErrorHandlerFunc(w, r, &InvalidParamFormatError{ParamName: "token", Err: err}) return } @@ -29016,7 +29016,7 @@ func (siw *ServerInterfaceWrapper) AcceptProjectInvite(w http.ResponseWriter, r r = r.WithContext(ctx) handler := http.Handler(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { - siw.Handler.AcceptProjectInvite(w, r, projectID, tokenNouncePair) + siw.Handler.AcceptProjectInvite(w, r, projectID, token) })) for _, middleware := range siw.HandlerMiddlewares { @@ -33949,7 +33949,7 @@ func HandlerWithOptions(si ServerInterface, options ChiServerOptions) http.Handl r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites", wrapper.CreateProjectInvite) }) r.Group(func(r chi.Router) { - r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites/accept/{tokenNouncePair}", wrapper.AcceptProjectInvite) + r.Post(options.BaseURL+"/api/admin/projects/{projectID}/invites/accept/{token}", wrapper.AcceptProjectInvite) }) r.Group(func(r chi.Router) { r.Delete(options.BaseURL+"/api/admin/projects/{projectID}/invites/{tokenNouncePair}", wrapper.RevokeProjectInvite) diff --git a/internal/http/controllers/v1/management/providers.go b/internal/http/controllers/v1/management/providers.go index 6febbed9..739ba123 100644 --- a/internal/http/controllers/v1/management/providers.go +++ b/internal/http/controllers/v1/management/providers.go @@ -286,7 +286,7 @@ func (srv *ProvidersController) CreateProvider(w http.ResponseWriter, r *http.Re } } - srv.autoAssignProjectProvider(ctx, logger, projectID, providerID, manifest) + srv.autoAssignPushProvider(ctx, logger, projectID, providerID, manifest) created, err := srv.store.ProvidersStore.GetProviderByProject(ctx, projectID, providerID) if err != nil { @@ -513,9 +513,9 @@ func validateRateLimit(rl *oapi.RateLimit, overrideAllowed bool) error { return nil } -// autoAssignProjectProvider assigns the newly created provider as the default push +// autoAssignPushProvider assigns the newly created provider as the default push // provider for any platforms it supports that don't already have one configured. -func (srv *ProvidersController) autoAssignProjectProvider(ctx context.Context, logger *zap.Logger, projectID, providerID uuid.UUID, manifest providers.ProviderManifest) { +func (srv *ProvidersController) autoAssignPushProvider(ctx context.Context, logger *zap.Logger, projectID, providerID uuid.UUID, manifest providers.ProviderManifest) { if len(manifest.Spec.Platforms) == 0 { return } diff --git a/internal/http/controllers/v1/management/push_providers.go b/internal/http/controllers/v1/management/push_providers.go index 10c4d9cc..0841e856 100644 --- a/internal/http/controllers/v1/management/push_providers.go +++ b/internal/http/controllers/v1/management/push_providers.go @@ -41,7 +41,6 @@ var validPlatforms = map[oapi.ProjectPushProviderPlatform]bool{ oapi.ProjectPushProviderPlatformIos: true, oapi.ProjectPushProviderPlatformAndroid: true, oapi.ProjectPushProviderPlatformWeb: true, - oapi.ProjectPushProviderPlatformEmail: true, } func (srv *PushProvidersController) ListProjectPushProviders(w http.ResponseWriter, r *http.Request, projectID uuid.UUID) { diff --git a/internal/store/management/migrations/1777887202000_migration.down.sql b/internal/store/management/migrations/1777887202000_migration.down.sql deleted file mode 100644 index 569ba624..00000000 --- a/internal/store/management/migrations/1777887202000_migration.down.sql +++ /dev/null @@ -1,27 +0,0 @@ --- down migration - --- drop new trigger -DROP TRIGGER set_updated_at_project_providers ON project_providers; - --- remove mail rows, these are gone for good -DELETE FROM project_providers WHERE platform = 'mail'; - --- preserve platform values while swapping the check constraint -ALTER TABLE project_providers ADD COLUMN platform_old VARCHAR(50); -UPDATE project_providers SET platform_old = platform; -ALTER TABLE project_providers DROP COLUMN platform; -ALTER TABLE project_providers ADD COLUMN platform VARCHAR(50) NOT NULL CHECK (platform IN ('ios', 'android', 'web')); -UPDATE project_providers SET platform = platform_old; -ALTER TABLE project_providers DROP COLUMN platform_old; - --- rename back -ALTER TABLE project_providers RENAME TO project_push_providers; - --- recreate original unique index -CREATE UNIQUE INDEX project_push_providers_project_platform_uniq -ON project_push_providers (project_id, platform); - --- recreate original trigger -CREATE TRIGGER set_updated_at_project_push_providers -BEFORE UPDATE ON project_push_providers -FOR EACH ROW EXECUTE PROCEDURE set_updated_at(); \ No newline at end of file diff --git a/internal/store/management/migrations/1777887202000_migration.up.sql b/internal/store/management/migrations/1777887202000_migration.up.sql deleted file mode 100644 index 76added3..00000000 --- a/internal/store/management/migrations/1777887202000_migration.up.sql +++ /dev/null @@ -1,21 +0,0 @@ --- rename the old table to the new name -ALTER TABLE project_push_providers RENAME TO project_providers; - --- drop the old trigger -DROP TRIGGER set_updated_at_project_push_providers ON project_providers; - -DROP INDEX project_push_providers_project_platform_uniq; - --- recreate trigger with new name -CREATE TRIGGER set_updated_at_project_providers -BEFORE UPDATE ON project_providers -FOR EACH ROW EXECUTE PROCEDURE set_updated_at(); - --- preserve existing platform values -ALTER TABLE project_providers ADD COLUMN platform_new VARCHAR(50) CHECK (platform_new IN ('ios', 'android', 'web', 'mail')); -UPDATE project_providers SET platform_new = platform; -ALTER TABLE project_providers DROP COLUMN platform; -ALTER TABLE project_providers RENAME COLUMN platform_new TO platform; -ALTER TABLE project_providers ALTER COLUMN platform SET NOT NULL; - -ALTER TABLE project_providers ADD CONSTRAINT project_providers_project_platform_uniq UNIQUE (project_id, platform); \ No newline at end of file diff --git a/internal/store/management/project_providers.go b/internal/store/management/project_providers.go index 9bfdf7f5..a53b9a77 100644 --- a/internal/store/management/project_providers.go +++ b/internal/store/management/project_providers.go @@ -62,7 +62,7 @@ type ProjectProvidersStore struct { // Returns the full row after the upsert. func (s *ProjectProvidersStore) UpsertProjectProvider(ctx context.Context, pp ProjectProvider) (*ProjectProvider, error) { stmt := ` - INSERT INTO project_providers (project_id, provider_id, platform) + INSERT INTO project_push_providers (project_id, provider_id, platform) VALUES ($1, $2, $3) ON CONFLICT (project_id, platform) DO UPDATE SET provider_id = EXCLUDED.provider_id @@ -85,7 +85,7 @@ func (s *ProjectProvidersStore) UpsertProjectProvider(ctx context.Context, pp Pr func (s *ProjectProvidersStore) ListProjectProviders(ctx context.Context, projectID uuid.UUID) (ProjectProviders, error) { query := ` SELECT id, project_id, provider_id, platform, created_at, updated_at - FROM project_providers + FROM project_push_providers WHERE project_id = $1 ORDER BY platform` @@ -102,7 +102,7 @@ func (s *ProjectProvidersStore) ListProjectProviders(ctx context.Context, projec func (s *ProjectProvidersStore) GetProjectProvider(ctx context.Context, projectID uuid.UUID, platform string) (*ProjectProvider, error) { query := ` SELECT id, project_id, provider_id, platform, created_at, updated_at - FROM project_providers + FROM project_push_providers WHERE project_id = $1 AND platform = $2` @@ -118,7 +118,7 @@ func (s *ProjectProvidersStore) GetProjectProvider(ctx context.Context, projectI // DeleteProjectProvider removes the provider mapping for a project+platform. func (s *ProjectProvidersStore) DeleteProjectProvider(ctx context.Context, projectID uuid.UUID, platform string) error { query := ` - DELETE FROM project_providers + DELETE FROM project_push_providers WHERE project_id = $1 AND platform = $2` diff --git a/internal/wasm/test/action.wasm b/internal/wasm/test/action.wasm index 5d84da897d262914e4fa04805ccbcd95e7e8aaa8..66e2a6440287a20767e10444ca9c5654c5f39ad2 100644 GIT binary patch delta 215406 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 z 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

{searchQuery ? t("no_results") - : t("no_integrations_available", "No integrations available")} + : t( + "no_integrations_available", + "No integrations available", + )}

) : ( diff --git a/console/src/views/settings/Settings.tsx b/console/src/views/settings/Settings.tsx index be819de5..ec453edf 100644 --- a/console/src/views/settings/Settings.tsx +++ b/console/src/views/settings/Settings.tsx @@ -30,7 +30,9 @@ export default function Settings() { { key: "general", to: "", label: t("general"), icon: SettingsLucideIcon }, { key: "locales", to: "locales", label: t("locales"), icon: Globe }, { key: "api-keys", to: "api-keys", label: t("api_keys"), icon: Key }, - { key: "invites", to: "invites", label: t("invites"), icon: UserPlus }, + ...(isEnterprise + ? [{ key: "invites", to: "invites", label: t("invites"), icon: UserPlus }] + : []), { key: "subscriptions", to: "subscriptions", label: t("subscriptions"), icon: Bell }, { key: "event-schemas", diff --git a/internal/http/controllers/v1/management/invites.go b/internal/http/controllers/v1/management/invites.go index f335e452..f1aed9af 100644 --- a/internal/http/controllers/v1/management/invites.go +++ b/internal/http/controllers/v1/management/invites.go @@ -1,25 +1,16 @@ +//go:build !enterprise + package v1 import ( - "crypto/aes" - "crypto/cipher" - "crypto/rand" - "database/sql" - "encoding/base64" - "errors" - "io" "net/http" - "time" "github.com/google/uuid" "github.com/jmoiron/sqlx" "github.com/lunogram/platform/internal/config" "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" - "github.com/lunogram/platform/internal/http/json" "github.com/lunogram/platform/internal/http/problem" "github.com/lunogram/platform/internal/rbac" - "github.com/lunogram/platform/internal/rbac/access" - "github.com/lunogram/platform/internal/store" "github.com/lunogram/platform/internal/store/management" "go.uber.org/zap" ) @@ -42,478 +33,22 @@ func NewInviteController(logger *zap.Logger, mgmt *management.State, engine *rba } } -func randomString(n int) (string, error) { - b := make([]byte, n) - _, err := rand.Read(b) - if err != nil { - return "", err - } - return base64.RawURLEncoding.EncodeToString(b), nil -} - -func getAesGCM(secretKey []byte) (cipher.AEAD, error) { - block, err := aes.NewCipher(secretKey) - if err != nil { - return nil, err - } - - aesgcm, err := cipher.NewGCM(block) - if err != nil { - return nil, err - } - - return aesgcm, nil -} - -func encryptToken(token string, secretKey string, nonce *string, logger zap.Logger) (string, string, error) { - if secretKey == "none" { - logger.Warn("Invite token encryption is disabled. This should only be used for testing and development.") - return token, "", nil - } - - // StdEncoding for the secret key (openssl rand -base64 32 speaks standard, not url). - // RawURLEncoding for everything that touches a URL (because "/" in a nonce or token will make your - // router throw a fit). mixing these up will ruin your day, as proven - // by the developer who wrote this comment after 2 hours of "illegal base64 data at input byte 17". - keyBytes, err := base64.StdEncoding.DecodeString(secretKey) - if err != nil { - return "", "", err - } - - aesgcm, err := getAesGCM(keyBytes) - if err != nil { - return "", "", err - } - - var nonceBytes []byte - if nonce == nil { - nonceBytes = make([]byte, aesgcm.NonceSize()) - if _, err = io.ReadFull(rand.Reader, nonceBytes); err != nil { - return "", "", err - } - } else { - nonceBytes, err = base64.RawURLEncoding.DecodeString(*nonce) - if err != nil { - return "", "", err - } - } - - ciphertext := aesgcm.Seal(nil, nonceBytes, []byte(token), nil) - return base64.RawURLEncoding.EncodeToString(ciphertext), base64.RawURLEncoding.EncodeToString(nonceBytes), nil -} - -func decryptToken(ciphertext string, nonce string, secretKey string, logger zap.Logger) (string, error) { - if secretKey == "none" { - logger.Warn("Invite token decryption is disabled. This should only be used for testing and development.") - return ciphertext, nil - } - - keyBytes, err := base64.StdEncoding.DecodeString(secretKey) - if err != nil { - return "", err - } - - aesgcm, err := getAesGCM(keyBytes) - if err != nil { - return "", err - } - - ciphertextBytes, err := base64.RawURLEncoding.DecodeString(ciphertext) - if err != nil { - return "", err - } - - nonceBytes, err := base64.RawURLEncoding.DecodeString(nonce) - if err != nil { - return "", err - } - - plaintext, err := aesgcm.Open(nil, nonceBytes, ciphertextBytes, nil) - if err != nil { - return "", err - } - - return string(plaintext), nil -} - -func unpackToken(mashed string, secretKey string, logger *zap.Logger) (string, string, error) { - if secretKey == "none" { - logger.Warn("Invite token unpacking is disabled. This should only be used for testing and development.") - return mashed, "", nil - } - - if len(mashed) < 16 { - return "", "", errors.New("mashed token too short") - } - - nonce := mashed[:16] - ciphertext := mashed[16:] - return ciphertext, nonce, nil -} - -func isRoleHigher(role1, role2 string) bool { - roleHierarchy := map[string]int{ - "support": 1, - "client": 1, - "editor": 2, - "admin": 3, - "owner": 4, - } - - return roleHierarchy[role1] > roleHierarchy[role2] -} - func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID) { - ctx := r.Context() - err := srv.engine.Allowed(ctx, rbac.Create, rbac.ProjectResourceScope("invites", projectID)) - if err != nil { - oapi.WriteProblem(w, err) - return - } - - body := oapi.CreateProjectInviteJSONRequestBody{} - err = json.Decode(r.Body, &body) - if err != nil { - oapi.WriteProblem(w, err) - return - } - - logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("email", string(body.Email))) - logger.Info("creating project invite") - - actor := rbac.FromContext(ctx) - InviterAdminID := actor.ID - - actorAdmin, err := srv.mgmt.GetAdmin(ctx, uuid.MustParse(InviterAdminID)) - if err != nil { - logger.Error("failed to get inviter admin details", zap.String("admin_id", InviterAdminID), zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - if actorAdmin.Email == string(body.Email) { - logger.Debug("inviter email matches invitee email, cannot create invite", zap.String("email", string(body.Email))) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("you cannot invite yourself to a project"))) - return - } - - actorRole := actorAdmin.Role - if actorRole != "" && isRoleHigher(string(body.Role), actorRole) { - logger.Debug("invite role is higher than existing admin role, cannot create invite", zap.String("email", string(body.Email)), zap.String("invite_role", string(body.Role)), zap.String("existing_role", actorRole)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("the role assigned by this invite must be equal to or lower than the existing global role of the admin with the same email"))) - return - } - - // at 1 billion invite tokens (~200GB of data), the probability of a collision - // is 10^-102%, a decimal point followed by 101 zeroes and a 1. if every atom - // in the observable universe (2^266) was an invite token, it'd still only be - // ~10^-21%. At that point we're also storing 2^266 * 200 bytes of data, which is a number so - // large it doesn't have a name. if this ever fires, forget the bug, go buy a lottery ticket. - token, err := randomString(50) - if err != nil { - logger.Error("failed to generate random token", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - encryptedToken, nonce, err := encryptToken(token, srv.cfg.SecretKey, nil, *logger) - if err != nil { - logger.Error("failed to encrypt invite token", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - expiresIn := "24h" - if body.ExpiresIn != nil { - expiresIn = *body.ExpiresIn - } - - invite, err := srv.mgmt.CreateProjectInvite(ctx, projectID, InviterAdminID, string(body.Email), body.Role, encryptedToken, nonce, expiresIn) - if err != nil { - logger.Error("failed to create project invite", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - logger.Info("Created project invite", zap.String("invite_id", invite.ID.String())) - - invite.Token = token - response := invite.OAPI() - json.Write(w, http.StatusOK, response) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project invites are not available in the open-source version"))) } func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Request, encryptionPair string) { - ctx := r.Context() - - encryptedToken, nonce, err := unpackToken(encryptionPair, srv.cfg.SecretKey, srv.logger) - if err != nil { - srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", encryptionPair), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) - return - } - - // yes, we're encrypting here to query, not decrypting. the DB stores the encrypted token, - // so we re-encrypt the plain token from the URL with the same nonce to reproduce the - // ciphertext we can actually look up. deterministic encryption is a feature, not a bug. - token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) - return - } - - invite, err := srv.mgmt.GetInviteByToken(ctx, token) - if err != nil { - if errors.Is(err, sql.ErrNoRows) { - srv.logger.Debug("invite not found", zap.String("token", token)) - oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) - } else { - srv.logger.Error("failed to get invite details", zap.String("token", token), zap.Error(err)) - oapi.WriteProblem(w, err) - } - return - } - - response := invite.OAPI() - resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - response.Token = &resToken - json.Write(w, http.StatusOK, response) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project invites are not available in the open-source version"))) } func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, token string) { - ctx := r.Context() - actor := rbac.FromContext(ctx) - - encryptedToken, nonce, err := unpackToken(token, srv.cfg.SecretKey, srv.logger) - if err != nil { - srv.logger.Error("failed to expand token and nonce", zap.String("token", token), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - token, _, err = encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - invite, err := srv.mgmt.GetInviteByToken(ctx, token) - if err != nil { - srv.logger.Debug("invite not found", zap.String("token", token), zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - adminId, err := uuid.Parse(actor.ID) - if err != nil { - srv.logger.Error("invalid admin ID in token", zap.String("admin_id", actor.ID), zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - admin, err := srv.mgmt.GetAdmin(ctx, adminId) - if err != nil { - srv.logger.Error("failed to get admin", zap.String("admin_id", adminId.String()), zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - if admin.Email != invite.InviteeEmail { - srv.logger.Debug("admin email does not match invitee email", zap.String("admin_email", admin.Email), zap.String("invitee_email", invite.InviteeEmail)) - oapi.WriteProblem(w, problem.ErrForbidden(problem.Describe("you do not have permission to accept this invite"))) - return - } - - tx, err := srv.db.BeginTxx(ctx, nil) - if err != nil { - srv.logger.Error("failed to begin transaction", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - defer tx.Rollback() //nolint:errcheck - - managementStore := management.NewState(tx) - - existingProjectAdmin, err := managementStore.GetProjectAdmin(ctx, projectID, adminId) - if err != nil && !errors.Is(err, sql.ErrNoRows) { - srv.logger.Error("failed to check existing project admin", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - if existingProjectAdmin != nil { - if isRoleHigher(invite.Role, existingProjectAdmin.Role) { - err = managementStore.UpdateProjectAdminRole(ctx, projectID, adminId, invite.Role) - if err != nil { - srv.logger.Error("failed to update admin project role", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - srv.logger.Info("upgraded admin project role", zap.String("admin_id", adminId.String()), zap.String("old_role", existingProjectAdmin.Role), zap.String("new_role", invite.Role)) - } - } else { - err = managementStore.AddAdminToProject(ctx, projectID, adminId, invite.Role) - if err != nil { - srv.logger.Error("failed to add admin to project", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - } - - //TODO: When the more more relation of the organizations x Admins is implemented, we should also add the user to the organization that the project belongs to. - - invite, err = managementStore.AcceptProjectInvite(ctx, token) - if err != nil { - srv.logger.Error("failed to accept project invite", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - if existingProjectAdmin != nil && isRoleHigher(invite.Role, existingProjectAdmin.Role) { - oldTuples := access.ProjectRoleTuples(adminId, projectID, existingProjectAdmin.Role) - err = srv.engine.DeleteTuples(ctx, oldTuples) - if err != nil { - srv.logger.Error("failed to delete old RBAC tuples", zap.Error(err)) - oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to update project role"))) - return - } - } - - projectTuples := access.ProjectRoleTuples(adminId, projectID, invite.Role) - err = srv.engine.WriteTuples(ctx, projectTuples) - if err != nil { - srv.logger.Error("failed to write RBAC tuples for project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) - return - } - - err = access.BackfillProjectTuples(ctx, srv.logger, srv.engine, srv.db) - if err != nil { - srv.logger.Error("failed to write RBAC tuples for new project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) - return - } - - err = tx.Commit() - if err != nil { - srv.logger.Error("failed to commit transaction", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("admin_id", adminId.String())) - logger.Info("accepted project invite and added admin to project") - - response := invite.OAPI() - resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - response.Token = &resToken - json.Write(w, http.StatusOK, response) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project invites are not available in the open-source version"))) } func (srv *InviteController) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, tokenNouncePair string) { - ctx := r.Context() - err := srv.engine.Allowed(ctx, rbac.Update, rbac.ProjectResourceScope("invites", projectID)) - if err != nil { - oapi.WriteProblem(w, err) - return - } - - encryptedToken, nonce, err := unpackToken(tokenNouncePair, srv.cfg.SecretKey, srv.logger) - if err != nil { - srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", tokenNouncePair), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - invite, err := srv.mgmt.RevokeProjectInvite(ctx, token) - if err != nil { - srv.logger.Debug("invite not found or already revoked/accepted", zap.String("token", token), zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - response := invite.OAPI() - resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - response.Token = &resToken - json.Write(w, http.StatusOK, response) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project invites are not available in the open-source version"))) } func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, params oapi.ListProjectInvitesParams) { - ctx := r.Context() - err := srv.engine.Allowed(ctx, rbac.Read, rbac.ProjectResourceScope("invites", projectID)) - if err != nil { - oapi.WriteProblem(w, err) - return - } - - logger := srv.logger.With(zap.Stringer("project_id", projectID)) - logger.Info("listing project invites") - - pagination := store.Pagination{ - Limit: params.Limit.ToInt(), - Offset: params.Offset.ToInt(), - } - - var expiresBefore, expiresAfter *string - if params.ExpiresBefore != nil { - s := params.ExpiresBefore.Time.Format(time.RFC3339) - expiresBefore = &s - } - if params.ExpiresAfter != nil { - s := params.ExpiresAfter.Time.Format(time.RFC3339) - expiresAfter = &s - } - - invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, expiresBefore, expiresAfter, params.InviterAdminId) - if err != nil { - logger.Error("failed to list project invites", zap.Error(err)) - oapi.WriteProblem(w, err) - return - } - - logger.Info("listed project invites", zap.Int("count", len(invites))) - response := make([]oapi.ProjectInvite, len(invites)) - for i, invite := range invites { - resToken, err := decryptToken(invite.Token, *invite.Nonce, srv.cfg.SecretKey, *srv.logger) - if err != nil { - srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response[i].Token), zap.Error(err)) - oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) - return - } - - response[i] = invite.OAPI() - response[i].Token = &resToken - } - - json.Write(w, http.StatusOK, oapi.ProjectInviteListResponse{ - Total: total, - Limit: pagination.Limit, - Offset: pagination.Offset, - Results: response, - }) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("project invites are not available in the open-source version"))) } diff --git a/internal/http/controllers/v1/management/invites_enterprise.go b/internal/http/controllers/v1/management/invites_enterprise.go new file mode 100644 index 00000000..8deaa0b8 --- /dev/null +++ b/internal/http/controllers/v1/management/invites_enterprise.go @@ -0,0 +1,521 @@ +//go:build enterprise + +package v1 + +import ( + "crypto/aes" + "crypto/cipher" + "crypto/rand" + "database/sql" + "encoding/base64" + "errors" + "io" + "net/http" + "time" + + "github.com/google/uuid" + "github.com/jmoiron/sqlx" + "github.com/lunogram/platform/internal/config" + "github.com/lunogram/platform/internal/http/controllers/v1/management/oapi" + "github.com/lunogram/platform/internal/http/json" + "github.com/lunogram/platform/internal/http/problem" + "github.com/lunogram/platform/internal/rbac" + "github.com/lunogram/platform/internal/rbac/access" + "github.com/lunogram/platform/internal/store" + "github.com/lunogram/platform/internal/store/management" + "go.uber.org/zap" +) + +type InviteController struct { + logger *zap.Logger + mgmt *management.State + engine *rbac.Engine + db *sqlx.DB + cfg config.Invites +} + +func NewInviteController(logger *zap.Logger, mgmt *management.State, engine *rbac.Engine, db *sqlx.DB, cfg config.Invites) *InviteController { + return &InviteController{ + logger: logger, + mgmt: mgmt, + engine: engine, + db: db, + cfg: cfg, + } +} + +func randomString(n int) (string, error) { + b := make([]byte, n) + _, err := rand.Read(b) + if err != nil { + return "", err + } + return base64.RawURLEncoding.EncodeToString(b), nil +} + +func getAesGCM(secretKey []byte) (cipher.AEAD, error) { + block, err := aes.NewCipher(secretKey) + if err != nil { + return nil, err + } + + aesgcm, err := cipher.NewGCM(block) + if err != nil { + return nil, err + } + + return aesgcm, nil +} + +func encryptToken(token string, secretKey string, nonce *string, logger zap.Logger) (string, string, error) { + if secretKey == "none" { + logger.Warn("Invite token encryption is disabled. This should only be used for testing and development.") + return token, "", nil + } + + // StdEncoding for the secret key (openssl rand -base64 32 speaks standard, not url). + // RawURLEncoding for everything that touches a URL (because "/" in a nonce or token will make your + // router throw a fit). mixing these up will ruin your day, as proven + // by the developer who wrote this comment after 2 hours of "illegal base64 data at input byte 17". + keyBytes, err := base64.StdEncoding.DecodeString(secretKey) + if err != nil { + return "", "", err + } + + aesgcm, err := getAesGCM(keyBytes) + if err != nil { + return "", "", err + } + + var nonceBytes []byte + if nonce == nil { + nonceBytes = make([]byte, aesgcm.NonceSize()) + if _, err = io.ReadFull(rand.Reader, nonceBytes); err != nil { + return "", "", err + } + } else { + nonceBytes, err = base64.RawURLEncoding.DecodeString(*nonce) + if err != nil { + return "", "", err + } + } + + ciphertext := aesgcm.Seal(nil, nonceBytes, []byte(token), nil) + return base64.RawURLEncoding.EncodeToString(ciphertext), base64.RawURLEncoding.EncodeToString(nonceBytes), nil +} + +func decryptToken(ciphertext string, nonce string, secretKey string, logger zap.Logger) (string, error) { + if secretKey == "none" { + logger.Warn("Invite token decryption is disabled. This should only be used for testing and development.") + return ciphertext, nil + } + + keyBytes, err := base64.StdEncoding.DecodeString(secretKey) + if err != nil { + return "", err + } + + aesgcm, err := getAesGCM(keyBytes) + if err != nil { + return "", err + } + + ciphertextBytes, err := base64.RawURLEncoding.DecodeString(ciphertext) + if err != nil { + return "", err + } + + nonceBytes, err := base64.RawURLEncoding.DecodeString(nonce) + if err != nil { + return "", err + } + + plaintext, err := aesgcm.Open(nil, nonceBytes, ciphertextBytes, nil) + if err != nil { + return "", err + } + + return string(plaintext), nil +} + +func unpackToken(mashed string, secretKey string, logger *zap.Logger) (string, string, error) { + if secretKey == "none" { + logger.Warn("Invite token unpacking is disabled. This should only be used for testing and development.") + return mashed, "", nil + } + + if len(mashed) < 16 { + return "", "", errors.New("mashed token too short") + } + + nonce := mashed[:16] + ciphertext := mashed[16:] + return ciphertext, nonce, nil +} + +func isRoleHigher(role1, role2 string) bool { + roleHierarchy := map[string]int{ + "support": 1, + "client": 1, + "editor": 2, + "admin": 3, + "owner": 4, + } + + return roleHierarchy[role1] > roleHierarchy[role2] +} + +func (srv *InviteController) CreateProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Create, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + body := oapi.CreateProjectInviteJSONRequestBody{} + err = json.Decode(r.Body, &body) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("email", string(body.Email))) + logger.Info("creating project invite") + + actor := rbac.FromContext(ctx) + InviterAdminID := actor.ID + + actorAdmin, err := srv.mgmt.GetAdmin(ctx, uuid.MustParse(InviterAdminID)) + if err != nil { + logger.Error("failed to get inviter admin details", zap.String("admin_id", InviterAdminID), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if actorAdmin.Email == string(body.Email) { + logger.Debug("inviter email matches invitee email, cannot create invite", zap.String("email", string(body.Email))) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("you cannot invite yourself to a project"))) + return + } + + actorRole := actorAdmin.Role + if actorRole != "" && isRoleHigher(string(body.Role), actorRole) { + logger.Debug("invite role is higher than existing admin role, cannot create invite", zap.String("email", string(body.Email)), zap.String("invite_role", string(body.Role)), zap.String("existing_role", actorRole)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("the role assigned by this invite must be equal to or lower than the existing global role of the admin with the same email"))) + return + } + + // at 1 billion invite tokens (~200GB of data), the probability of a collision + // is 10^-102%, a decimal point followed by 101 zeroes and a 1. if every atom + // in the observable universe (2^266) was an invite token, it'd still only be + // ~10^-21%. At that point we're also storing 2^266 * 200 bytes of data, which is a number so + // large it doesn't have a name. if this ever fires, forget the bug, go buy a lottery ticket. + token, err := randomString(50) + if err != nil { + logger.Error("failed to generate random token", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + encryptedToken, nonce, err := encryptToken(token, srv.cfg.SecretKey, nil, *logger) + if err != nil { + logger.Error("failed to encrypt invite token", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + expiresIn := "24h" + if body.ExpiresIn != nil { + expiresIn = *body.ExpiresIn + } + + invite, err := srv.mgmt.CreateProjectInvite(ctx, projectID, InviterAdminID, string(body.Email), body.Role, encryptedToken, nonce, expiresIn) + if err != nil { + logger.Error("failed to create project invite", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger.Info("Created project invite", zap.String("invite_id", invite.ID.String())) + + invite.Token = token + response := invite.OAPI() + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) GetInviteDetails(w http.ResponseWriter, r *http.Request, encryptionPair string) { + ctx := r.Context() + + encryptedToken, nonce, err := unpackToken(encryptionPair, srv.cfg.SecretKey, srv.logger) + if err != nil { + srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", encryptionPair), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) + return + } + + // yes, we're encrypting here to query, not decrypting. the DB stores the encrypted token, + // so we re-encrypt the plain token from the URL with the same nonce to reproduce the + // ciphertext we can actually look up. deterministic encryption is a feature, not a bug. + token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) + return + } + + invite, err := srv.mgmt.GetInviteByToken(ctx, token) + if err != nil { + if errors.Is(err, sql.ErrNoRows) { + srv.logger.Debug("invite not found", zap.String("token", token)) + oapi.WriteProblem(w, problem.ErrNotFound(problem.Describe("invite not found"))) + } else { + srv.logger.Error("failed to get invite details", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + } + return + } + + response := invite.OAPI() + resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + response.Token = &resToken + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) AcceptProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, token string) { + ctx := r.Context() + actor := rbac.FromContext(ctx) + + encryptedToken, nonce, err := unpackToken(token, srv.cfg.SecretKey, srv.logger) + if err != nil { + srv.logger.Error("failed to expand token and nonce", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + token, _, err = encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + invite, err := srv.mgmt.GetInviteByToken(ctx, token) + if err != nil { + srv.logger.Debug("invite not found", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + adminId, err := uuid.Parse(actor.ID) + if err != nil { + srv.logger.Error("invalid admin ID in token", zap.String("admin_id", actor.ID), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + admin, err := srv.mgmt.GetAdmin(ctx, adminId) + if err != nil { + srv.logger.Error("failed to get admin", zap.String("admin_id", adminId.String()), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if admin.Email != invite.InviteeEmail { + srv.logger.Debug("admin email does not match invitee email", zap.String("admin_email", admin.Email), zap.String("invitee_email", invite.InviteeEmail)) + oapi.WriteProblem(w, problem.ErrForbidden(problem.Describe("you do not have permission to accept this invite"))) + return + } + + tx, err := srv.db.BeginTxx(ctx, nil) + if err != nil { + srv.logger.Error("failed to begin transaction", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + defer tx.Rollback() //nolint:errcheck + + managementStore := management.NewState(tx) + + existingProjectAdmin, err := managementStore.GetProjectAdmin(ctx, projectID, adminId) + if err != nil && !errors.Is(err, sql.ErrNoRows) { + srv.logger.Error("failed to check existing project admin", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if existingProjectAdmin != nil { + if isRoleHigher(invite.Role, existingProjectAdmin.Role) { + err = managementStore.UpdateProjectAdminRole(ctx, projectID, adminId, invite.Role) + if err != nil { + srv.logger.Error("failed to update admin project role", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + srv.logger.Info("upgraded admin project role", zap.String("admin_id", adminId.String()), zap.String("old_role", existingProjectAdmin.Role), zap.String("new_role", invite.Role)) + } + } else { + err = managementStore.AddAdminToProject(ctx, projectID, adminId, invite.Role) + if err != nil { + srv.logger.Error("failed to add admin to project", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + } + + //TODO: When the more more relation of the organizations x Admins is implemented, we should also add the user to the organization that the project belongs to. + + invite, err = managementStore.AcceptProjectInvite(ctx, token) + if err != nil { + srv.logger.Error("failed to accept project invite", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + if existingProjectAdmin != nil && isRoleHigher(invite.Role, existingProjectAdmin.Role) { + oldTuples := access.ProjectRoleTuples(adminId, projectID, existingProjectAdmin.Role) + err = srv.engine.DeleteTuples(ctx, oldTuples) + if err != nil { + srv.logger.Error("failed to delete old RBAC tuples", zap.Error(err)) + oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to update project role"))) + return + } + } + + projectTuples := access.ProjectRoleTuples(adminId, projectID, invite.Role) + err = srv.engine.WriteTuples(ctx, projectTuples) + if err != nil { + srv.logger.Error("failed to write RBAC tuples for project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) + return + } + + err = access.BackfillProjectTuples(ctx, srv.logger, srv.engine, srv.db) + if err != nil { + srv.logger.Error("failed to write RBAC tuples for new project admin", zap.String("admin_id", adminId.String()), zap.String("project_id", invite.ProjectID.String()), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrInternal(problem.Describe("failed to assign project role"))) + return + } + + err = tx.Commit() + if err != nil { + srv.logger.Error("failed to commit transaction", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.String("project_id", projectID.String()), zap.String("admin_id", adminId.String())) + logger.Info("accepted project invite and added admin to project") + + response := invite.OAPI() + resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + response.Token = &resToken + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) RevokeProjectInvite(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, tokenNouncePair string) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Update, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + encryptedToken, nonce, err := unpackToken(tokenNouncePair, srv.cfg.SecretKey, srv.logger) + if err != nil { + srv.logger.Error("failed to expand token and nonce", zap.String("token_nounce_pair", tokenNouncePair), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + token, _, err := encryptToken(encryptedToken, srv.cfg.SecretKey, &nonce, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt token", zap.String("encrypted_token", encryptedToken), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + invite, err := srv.mgmt.RevokeProjectInvite(ctx, token) + if err != nil { + srv.logger.Debug("invite not found or already revoked/accepted", zap.String("token", token), zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + response := invite.OAPI() + resToken, err := decryptToken(*response.Token, nonce, srv.cfg.SecretKey, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response.Token), zap.String("nonce", string(nonce)), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + response.Token = &resToken + json.Write(w, http.StatusOK, response) +} + +func (srv *InviteController) ListProjectInvites(w http.ResponseWriter, r *http.Request, projectID uuid.UUID, params oapi.ListProjectInvitesParams) { + ctx := r.Context() + err := srv.engine.Allowed(ctx, rbac.Read, rbac.ProjectResourceScope("invites", projectID)) + if err != nil { + oapi.WriteProblem(w, err) + return + } + + logger := srv.logger.With(zap.Stringer("project_id", projectID)) + logger.Info("listing project invites") + + pagination := store.Pagination{ + Limit: params.Limit.ToInt(), + Offset: params.Offset.ToInt(), + } + + var expiresBefore, expiresAfter *string + if params.ExpiresBefore != nil { + s := params.ExpiresBefore.Time.Format(time.RFC3339) + expiresBefore = &s + } + if params.ExpiresAfter != nil { + s := params.ExpiresAfter.Time.Format(time.RFC3339) + expiresAfter = &s + } + + invites, total, err := srv.mgmt.ListProjectInvites(ctx, projectID, pagination, params.Search.ToString(), params.Role, params.Status, expiresBefore, expiresAfter, params.InviterAdminId) + if err != nil { + logger.Error("failed to list project invites", zap.Error(err)) + oapi.WriteProblem(w, err) + return + } + + logger.Info("listed project invites", zap.Int("count", len(invites))) + response := make([]oapi.ProjectInvite, len(invites)) + for i, invite := range invites { + resToken, err := decryptToken(invite.Token, *invite.Nonce, srv.cfg.SecretKey, *srv.logger) + if err != nil { + srv.logger.Error("failed to decrypt invite token", zap.String("encrypted_token", *response[i].Token), zap.Error(err)) + oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("invalid invite token"))) + return + } + + response[i] = invite.OAPI() + response[i].Token = &resToken + } + + json.Write(w, http.StatusOK, oapi.ProjectInviteListResponse{ + Total: total, + Limit: pagination.Limit, + Offset: pagination.Offset, + Results: response, + }) +} From 232b139c08a343a98b3f2cb950ea2caf9663d3bb Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Wed, 6 May 2026 14:37:05 +0200 Subject: [PATCH 21/22] fix: disable eslint rule for scheduledAt input change handler --- console/src/views/broadcast/CreateBroadcastDialog.tsx | 1 + 1 file changed, 1 insertion(+) diff --git a/console/src/views/broadcast/CreateBroadcastDialog.tsx b/console/src/views/broadcast/CreateBroadcastDialog.tsx index c6c2a037..0b7c2b26 100644 --- a/console/src/views/broadcast/CreateBroadcastDialog.tsx +++ b/console/src/views/broadcast/CreateBroadcastDialog.tsx @@ -269,6 +269,7 @@ export function CreateBroadcastDialog({ type="datetime-local" value={scheduledAt} onChange={(e) => setScheduledAt(e.target.value)} + // eslint-disable-next-line react-hooks/purity min={new Date(Date.now() + 60_000).toISOString().slice(0, 16)} /> )} From e4b293eeb5a7de923b7c3b2d9836809c321cb50e Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Wed, 6 May 2026 14:47:19 +0200 Subject: [PATCH 22/22] feat: implement project push provider management functionality --- .../controllers/v1/management/providers.go | 4 +- .../v1/management/push_providers.go | 6 +-- .../controllers/v1/management/templates.go | 4 +- internal/pubsub/consumer/campaigns.go | 2 +- ...providers.go => project_push_providers.go} | 22 +++++------ ...test.go => project_push_providers_test.go} | 36 +++++++++--------- internal/store/management/store.go | 38 +++++++++---------- pkg/modules/channel.go | 1 - 8 files changed, 56 insertions(+), 57 deletions(-) rename internal/store/management/{project_providers.go => project_push_providers.go} (72%) rename internal/store/management/{project_providers_test.go => project_push_providers_test.go} (82%) diff --git a/internal/http/controllers/v1/management/providers.go b/internal/http/controllers/v1/management/providers.go index 739ba123..afd4a3ac 100644 --- a/internal/http/controllers/v1/management/providers.go +++ b/internal/http/controllers/v1/management/providers.go @@ -520,7 +520,7 @@ func (srv *ProvidersController) autoAssignPushProvider(ctx context.Context, logg return } - existing, err := srv.store.ProjectProvidersStore.ListProjectProviders(ctx, projectID) + existing, err := srv.store.ProjectPushProvidersStore.ListProjectPushProviders(ctx, projectID) if err != nil { logger.Error("failed to list push providers for auto-default", zap.Error(err)) return @@ -536,7 +536,7 @@ func (srv *ProvidersController) autoAssignPushProvider(ctx context.Context, logg continue } - _, err := srv.store.ProjectProvidersStore.UpsertProjectProvider(ctx, management.ProjectProvider{ + _, err := srv.store.ProjectPushProvidersStore.UpsertProjectPushProvider(ctx, management.ProjectProvider{ ProjectID: projectID, ProviderID: providerID, Platform: platform.String(), diff --git a/internal/http/controllers/v1/management/push_providers.go b/internal/http/controllers/v1/management/push_providers.go index 0841e856..ce4b2bee 100644 --- a/internal/http/controllers/v1/management/push_providers.go +++ b/internal/http/controllers/v1/management/push_providers.go @@ -68,7 +68,7 @@ func (srv *PushProvidersController) ListProjectPushProviders(w http.ResponseWrit return } - providers, err := srv.store.ProjectProvidersStore.ListProjectProviders(ctx, projectID) + providers, err := srv.store.ProjectPushProvidersStore.ListProjectPushProviders(ctx, projectID) if err != nil { logger.Error("failed to list push providers", zap.Error(err)) oapi.WriteProblem(w, err) @@ -147,7 +147,7 @@ func (srv *PushProvidersController) UpsertProjectPushProvider(w http.ResponseWri return } - pp, err := srv.store.ProjectProvidersStore.UpsertProjectProvider(ctx, management.ProjectProvider{ + pp, err := srv.store.ProjectPushProvidersStore.UpsertProjectPushProvider(ctx, management.ProjectProvider{ ProjectID: projectID, ProviderID: body.ProviderId, Platform: string(platform), @@ -196,7 +196,7 @@ func (srv *PushProvidersController) DeleteProjectPushProvider(w http.ResponseWri return } - err = srv.store.ProjectProvidersStore.DeleteProjectProvider(ctx, projectID, string(platform)) + err = srv.store.ProjectPushProvidersStore.DeleteProjectPushProvider(ctx, projectID, string(platform)) if err != nil { logger.Error("failed to delete push provider", zap.Error(err)) oapi.WriteProblem(w, err) diff --git a/internal/http/controllers/v1/management/templates.go b/internal/http/controllers/v1/management/templates.go index 681dd468..a6b612e5 100644 --- a/internal/http/controllers/v1/management/templates.go +++ b/internal/http/controllers/v1/management/templates.go @@ -462,7 +462,7 @@ func (srv *TemplatesController) SendTest(w http.ResponseWriter, r *http.Request, var provider *management.Provider if providerPlatform != "" { - pp, err := srv.store.ProjectProvidersStore.GetProjectProvider(ctx, projectID, providerPlatform) + pp, err := srv.store.ProjectPushProvidersStore.GetProjectPushProvider(ctx, projectID, providerPlatform) if errors.Is(err, sql.ErrNoRows) { oapi.WriteProblem(w, problem.ErrBadRequest(problem.Describe("no push provider configured for selected device platform"))) return @@ -480,7 +480,7 @@ func (srv *TemplatesController) SendTest(w http.ResponseWriter, r *http.Request, return } } else { - pushProviders, err := srv.store.ProjectProvidersStore.ListProjectProviders(ctx, projectID) + pushProviders, err := srv.store.ProjectPushProvidersStore.ListProjectPushProviders(ctx, projectID) if err != nil { logger.Error("failed to list push providers", zap.Error(err)) oapi.WriteProblem(w, err) diff --git a/internal/pubsub/consumer/campaigns.go b/internal/pubsub/consumer/campaigns.go index 65297584..94bd620d 100644 --- a/internal/pubsub/consumer/campaigns.go +++ b/internal/pubsub/consumer/campaigns.go @@ -492,7 +492,7 @@ func resolvePushDispatches(ctx context.Context, mgmt *management.State, projectI return nil, Permanentf("user %s has no push-enabled devices", userID) } - pushProviders, err := mgmt.ProjectProvidersStore.ListProjectProviders(ctx, projectID) + pushProviders, err := mgmt.ProjectPushProvidersStore.ListProjectPushProviders(ctx, projectID) if err != nil { return nil, fmt.Errorf("list project push providers: %w", err) } diff --git a/internal/store/management/project_providers.go b/internal/store/management/project_push_providers.go similarity index 72% rename from internal/store/management/project_providers.go rename to internal/store/management/project_push_providers.go index a53b9a77..5d096174 100644 --- a/internal/store/management/project_providers.go +++ b/internal/store/management/project_push_providers.go @@ -50,17 +50,17 @@ func (p ProjectProvider) OAPI() oapi.ProjectPushProvider { } } -func NewProjectProvidersStore(db store.DB) *ProjectProvidersStore { - return &ProjectProvidersStore{db: db} +func NewProjectPushProvidersStore(db store.DB) *ProjectPushProvidersStore { + return &ProjectPushProvidersStore{db: db} } -type ProjectProvidersStore struct { +type ProjectPushProvidersStore struct { db store.DB } -// UpsertProjectProvider creates or updates the provider for a given project+platform. +// UpsertProjectPushProvider creates or updates the provider for a given project+platform. // Returns the full row after the upsert. -func (s *ProjectProvidersStore) UpsertProjectProvider(ctx context.Context, pp ProjectProvider) (*ProjectProvider, error) { +func (s *ProjectPushProvidersStore) UpsertProjectPushProvider(ctx context.Context, pp ProjectProvider) (*ProjectProvider, error) { stmt := ` INSERT INTO project_push_providers (project_id, provider_id, platform) VALUES ($1, $2, $3) @@ -81,8 +81,8 @@ func (s *ProjectProvidersStore) UpsertProjectProvider(ctx context.Context, pp Pr return &result, nil } -// ListProjectProviders returns all provider mappings for a project. -func (s *ProjectProvidersStore) ListProjectProviders(ctx context.Context, projectID uuid.UUID) (ProjectProviders, error) { +// ListProjectPushProviders returns all provider mappings for a project. +func (s *ProjectPushProvidersStore) ListProjectPushProviders(ctx context.Context, projectID uuid.UUID) (ProjectProviders, error) { query := ` SELECT id, project_id, provider_id, platform, created_at, updated_at FROM project_push_providers @@ -98,8 +98,8 @@ func (s *ProjectProvidersStore) ListProjectProviders(ctx context.Context, projec return result, nil } -// GetProjectProvider returns the provider for a specific project+platform. -func (s *ProjectProvidersStore) GetProjectProvider(ctx context.Context, projectID uuid.UUID, platform string) (*ProjectProvider, error) { +// GetProjectPushProvider returns the provider for a specific project+platform. +func (s *ProjectPushProvidersStore) GetProjectPushProvider(ctx context.Context, projectID uuid.UUID, platform string) (*ProjectProvider, error) { query := ` SELECT id, project_id, provider_id, platform, created_at, updated_at FROM project_push_providers @@ -115,8 +115,8 @@ func (s *ProjectProvidersStore) GetProjectProvider(ctx context.Context, projectI return &pp, nil } -// DeleteProjectProvider removes the provider mapping for a project+platform. -func (s *ProjectProvidersStore) DeleteProjectProvider(ctx context.Context, projectID uuid.UUID, platform string) error { +// DeleteProjectPushProvider removes the provider mapping for a project+platform. +func (s *ProjectPushProvidersStore) DeleteProjectPushProvider(ctx context.Context, projectID uuid.UUID, platform string) error { query := ` DELETE FROM project_push_providers WHERE project_id = $1 diff --git a/internal/store/management/project_providers_test.go b/internal/store/management/project_push_providers_test.go similarity index 82% rename from internal/store/management/project_providers_test.go rename to internal/store/management/project_push_providers_test.go index c2e149ae..e1fb9e6e 100644 --- a/internal/store/management/project_providers_test.go +++ b/internal/store/management/project_push_providers_test.go @@ -42,7 +42,7 @@ func TestProjectProvidersStore(t *testing.T) { t.Run("upsert creates new push provider", func(t *testing.T) { providerID := createProvider(t, "FCM iOS") - result, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + result, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: providerID, Platform: PlatformIOS, @@ -60,14 +60,14 @@ func TestProjectProvidersStore(t *testing.T) { providerA := createProvider(t, "FCM Android A") providerB := createProvider(t, "FCM Android B") - resultA, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + resultA, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: providerA, Platform: PlatformAndroid, }) require.NoError(t, err) - resultB, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + resultB, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: providerB, Platform: PlatformAndroid, @@ -80,7 +80,7 @@ func TestProjectProvidersStore(t *testing.T) { }) t.Run("upsert with non-existent provider returns error", func(t *testing.T) { - _, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + _, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: uuid.New(), Platform: PlatformWeb, @@ -92,14 +92,14 @@ func TestProjectProvidersStore(t *testing.T) { t.Run("get returns push provider by platform", func(t *testing.T) { providerID := createProvider(t, "FCM Web") - created, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + created, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: providerID, Platform: PlatformWeb, }) require.NoError(t, err) - got, err := db.GetProjectProvider(ctx, projectID, PlatformWeb) + got, err := db.GetProjectPushProvider(ctx, projectID, PlatformWeb) require.NoError(t, err) assert.Equal(t, created.ID, got.ID) assert.Equal(t, providerID, got.ProviderID) @@ -115,7 +115,7 @@ func TestProjectProvidersStore(t *testing.T) { }) require.NoError(t, err) - _, err = db.GetProjectProvider(ctx, otherProjectID, PlatformIOS) + _, err = db.GetProjectPushProvider(ctx, otherProjectID, PlatformIOS) require.Error(t, err) }) @@ -131,21 +131,21 @@ func TestProjectProvidersStore(t *testing.T) { providerA := createProvider(t, "List Provider A") providerB := createProvider(t, "List Provider B") - _, err = db.UpsertProjectProvider(ctx, ProjectProvider{ + _, err = db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: listProjectID, ProviderID: providerA, Platform: PlatformAndroid, }) require.NoError(t, err) - _, err = db.UpsertProjectProvider(ctx, ProjectProvider{ + _, err = db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: listProjectID, ProviderID: providerB, Platform: PlatformIOS, }) require.NoError(t, err) - providers, err := db.ListProjectProviders(ctx, listProjectID) + providers, err := db.ListProjectPushProviders(ctx, listProjectID) require.NoError(t, err) assert.Len(t, providers, 2) @@ -163,7 +163,7 @@ func TestProjectProvidersStore(t *testing.T) { }) require.NoError(t, err) - providers, err := db.ListProjectProviders(ctx, emptyProjectID) + providers, err := db.ListProjectPushProviders(ctx, emptyProjectID) require.NoError(t, err) assert.Empty(t, providers) }) @@ -179,29 +179,29 @@ func TestProjectProvidersStore(t *testing.T) { providerID := createProvider(t, "Delete Provider") - _, err = db.UpsertProjectProvider(ctx, ProjectProvider{ + _, err = db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: deleteProjectID, ProviderID: providerID, Platform: PlatformIOS, }) require.NoError(t, err) - err = db.DeleteProjectProvider(ctx, deleteProjectID, PlatformIOS) + err = db.DeleteProjectPushProvider(ctx, deleteProjectID, PlatformIOS) require.NoError(t, err) - _, err = db.GetProjectProvider(ctx, deleteProjectID, PlatformIOS) + _, err = db.GetProjectPushProvider(ctx, deleteProjectID, PlatformIOS) require.Error(t, err) }) t.Run("delete is idempotent for non-existent platform", func(t *testing.T) { - err := db.DeleteProjectProvider(ctx, projectID, "nonexistent") + err := db.DeleteProjectPushProvider(ctx, projectID, "nonexistent") require.NoError(t, err) }) t.Run("OAPI conversion", func(t *testing.T) { providerID := createProvider(t, "OAPI Provider") - result, err := db.UpsertProjectProvider(ctx, ProjectProvider{ + result, err := db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: projectID, ProviderID: providerID, Platform: PlatformIOS, @@ -227,14 +227,14 @@ func TestProjectProvidersStore(t *testing.T) { providerID := createProvider(t, "OAPI Slice Provider") - _, err = db.UpsertProjectProvider(ctx, ProjectProvider{ + _, err = db.UpsertProjectPushProvider(ctx, ProjectProvider{ ProjectID: sliceProjectID, ProviderID: providerID, Platform: PlatformAndroid, }) require.NoError(t, err) - providers, err := db.ListProjectProviders(ctx, sliceProjectID) + providers, err := db.ListProjectPushProviders(ctx, sliceProjectID) require.NoError(t, err) oapiSlice := providers.OAPI() diff --git a/internal/store/management/store.go b/internal/store/management/store.go index 89b3395a..30796d42 100644 --- a/internal/store/management/store.go +++ b/internal/store/management/store.go @@ -6,24 +6,24 @@ import ( func NewState(db store.DB) *State { return &State{ - AdminsStore: NewAdminsStore(db), - ProjectsStore: NewProjectsStore(db), - CampaignsStore: NewCampaignsStore(db), - ProvidersStore: NewProvidersStore(db), - TemplatesStore: NewTemplatesStore(db), - SubscriptionsStore: NewSubscriptionsStore(db), - OrganizationsStore: NewOrganizationsStore(db), - TagsStore: NewTagsStore(db), - LocalesStore: NewLocalesStore(db), - DocumentsStore: NewDocumentsStore(db), - AuthStore: NewAuthStore(db), - ApiKeysStore: NewApiKeysStore(db), - ActionsStore: NewActionsStore(db), - SenderIdentitiesStore: NewSenderIdentitiesStore(db), - BroadcastsStore: NewBroadcastsStore(db), - ProjectProvidersStore: NewProjectProvidersStore(db), - VapidKeysStore: NewVapidKeysStore(db), - InvitesStore: NewInvitesStore(db), + AdminsStore: NewAdminsStore(db), + ProjectsStore: NewProjectsStore(db), + CampaignsStore: NewCampaignsStore(db), + ProvidersStore: NewProvidersStore(db), + TemplatesStore: NewTemplatesStore(db), + SubscriptionsStore: NewSubscriptionsStore(db), + OrganizationsStore: NewOrganizationsStore(db), + TagsStore: NewTagsStore(db), + LocalesStore: NewLocalesStore(db), + DocumentsStore: NewDocumentsStore(db), + AuthStore: NewAuthStore(db), + ApiKeysStore: NewApiKeysStore(db), + ActionsStore: NewActionsStore(db), + SenderIdentitiesStore: NewSenderIdentitiesStore(db), + BroadcastsStore: NewBroadcastsStore(db), + ProjectPushProvidersStore: NewProjectPushProvidersStore(db), + VapidKeysStore: NewVapidKeysStore(db), + InvitesStore: NewInvitesStore(db), } } @@ -43,7 +43,7 @@ type State struct { *ActionsStore *SenderIdentitiesStore *BroadcastsStore - *ProjectProvidersStore + *ProjectPushProvidersStore *VapidKeysStore *InvitesStore } diff --git a/pkg/modules/channel.go b/pkg/modules/channel.go index 060bdcb8..e177f7a1 100644 --- a/pkg/modules/channel.go +++ b/pkg/modules/channel.go @@ -16,5 +16,4 @@ const ( PlatformIOS Platform = "ios" PlatformAndroid Platform = "android" PlatformWeb Platform = "web" - PlatformEmail Platform = "email" )

jXx<$4 delta 205698 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%0A+N;RCR^p|r{ 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%0A>qnK7*$@w9$w~V&WvwN@vgdc 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ÎOkcKiDS3;` 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�FHW!NTuf{s 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 diff --git a/modules/resend/main.go b/modules/resend/main.go index 3e971314..bef7d9c4 100644 --- a/modules/resend/main.go +++ b/modules/resend/main.go @@ -15,9 +15,8 @@ import ( func providerCapabilitySpec() json.RawMessage { spec, err := json.Marshal(modules.ProviderSpec{ - Platforms: []modules.Platform{modules.PlatformEmail}, - Channels: []modules.Channel{modules.ChannelEmail}, - Webhook: true, + Channels: []modules.Channel{modules.ChannelEmail}, + Webhook: true, RateLimit: &modules.RateLimit{ Limit: 5, Interval: "1s", diff --git a/pkg/modules/providers/channel.go b/pkg/modules/providers/channel.go index 1375c4a9..837a83d3 100644 --- a/pkg/modules/providers/channel.go +++ b/pkg/modules/providers/channel.go @@ -31,7 +31,6 @@ const ( PlatformIOS Platform = "ios" PlatformAndroid Platform = "android" PlatformWeb Platform = "web" - PlatformEmail Platform = "email" ) // String returns the string representation of the platform. @@ -42,7 +41,7 @@ func (p Platform) String() string { // IsValid checks if the platform is a valid known platform type. func (p Platform) IsValid() bool { switch p { - case PlatformIOS, PlatformAndroid, PlatformWeb, PlatformEmail: + case PlatformIOS, PlatformAndroid, PlatformWeb: return true default: return false From 6df19ef79e019d512f61ead973b9ba8a1a11d7a5 Mon Sep 17 00:00:00 2001 From: IAmKirbki Date: Wed, 6 May 2026 14:23:48 +0200 Subject: [PATCH 20/22] feat(invites): implement enterprise invite management functionality --- console/src/views/settings/NewIntegration.tsx | 5 +- console/src/views/settings/Settings.tsx | 4 +- .../http/controllers/v1/management/invites.go | 479 +--------------- .../v1/management/invites_enterprise.go | 521 ++++++++++++++++++ 4 files changed, 535 insertions(+), 474 deletions(-) create mode 100644 internal/http/controllers/v1/management/invites_enterprise.go diff --git a/console/src/views/settings/NewIntegration.tsx b/console/src/views/settings/NewIntegration.tsx index e2d7eb83..6f0ec558 100644 --- a/console/src/views/settings/NewIntegration.tsx +++ b/console/src/views/settings/NewIntegration.tsx @@ -170,7 +170,10 @@ export default function NewIntegration() {