Replace the entity slugs on organizations, workspaces, resource pools, and plan ladders with nullable `key` columns and add keys to products, prices, and entitlement sets. Rename `providers.slug` to `provider` and add partial unique indexes for system and org role names. Assign invoice numbers per billing account from a gapless transactional counter; Stripe's number moves to the invoice mapping as an external reference. Seeds, fixtures, and the operator lookup address rows by key, and the returning-login resync no longer blanks a display name when the IdP sends no `name` claim.
252 lines
6.8 KiB
Go
252 lines
6.8 KiB
Go
// Code generated by sqlc. DO NOT EDIT.
|
|
// versions:
|
|
// sqlc v1.29.0
|
|
// source: members.sql
|
|
|
|
package organization
|
|
|
|
import (
|
|
"context"
|
|
"database/sql"
|
|
"time"
|
|
)
|
|
|
|
const createOrgMember = `-- name: CreateOrgMember :one
|
|
INSERT INTO core.org_members (org_id, person_id, role_id)
|
|
VALUES ($1, $2, $3)
|
|
RETURNING org_member_id, org_id, person_id, role_id, status, joined_at, removed_at, created_at, updated_at
|
|
`
|
|
|
|
type CreateOrgMemberParams struct {
|
|
OrgID string `json:"org_id"`
|
|
PersonID string `json:"person_id"`
|
|
RoleID string `json:"role_id"`
|
|
}
|
|
|
|
func (q *Queries) CreateOrgMember(ctx context.Context, arg CreateOrgMemberParams) (OrgMember, error) {
|
|
row := q.db.QueryRowContext(ctx, createOrgMember, arg.OrgID, arg.PersonID, arg.RoleID)
|
|
var i OrgMember
|
|
err := row.Scan(
|
|
&i.OrgMemberID,
|
|
&i.OrgID,
|
|
&i.PersonID,
|
|
&i.RoleID,
|
|
&i.Status,
|
|
&i.JoinedAt,
|
|
&i.RemovedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getOrgMemberByPersonAndOrg = `-- name: GetOrgMemberByPersonAndOrg :one
|
|
SELECT org_member_id, org_id, person_id, role_id, status, joined_at, removed_at, created_at, updated_at FROM core.org_members
|
|
WHERE person_id = $1 AND org_id = $2
|
|
`
|
|
|
|
type GetOrgMemberByPersonAndOrgParams struct {
|
|
PersonID string `json:"person_id"`
|
|
OrgID string `json:"org_id"`
|
|
}
|
|
|
|
func (q *Queries) GetOrgMemberByPersonAndOrg(ctx context.Context, arg GetOrgMemberByPersonAndOrgParams) (OrgMember, error) {
|
|
row := q.db.QueryRowContext(ctx, getOrgMemberByPersonAndOrg, arg.PersonID, arg.OrgID)
|
|
var i OrgMember
|
|
err := row.Scan(
|
|
&i.OrgMemberID,
|
|
&i.OrgID,
|
|
&i.PersonID,
|
|
&i.RoleID,
|
|
&i.Status,
|
|
&i.JoinedAt,
|
|
&i.RemovedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
)
|
|
return i, err
|
|
}
|
|
|
|
const getOrgMembersByOrgID = `-- name: GetOrgMembersByOrgID :many
|
|
SELECT om.org_member_id, om.org_id, om.person_id, om.role_id, om.status, om.joined_at, om.removed_at, om.created_at, om.updated_at, p.display_name, p.primary_email, r.role_name
|
|
FROM core.org_members om
|
|
JOIN core.persons p ON p.person_id = om.person_id
|
|
JOIN core.roles r ON r.role_id = om.role_id
|
|
WHERE om.org_id = $1
|
|
ORDER BY p.display_name
|
|
`
|
|
|
|
type GetOrgMembersByOrgIDRow struct {
|
|
OrgMemberID string `json:"org_member_id"`
|
|
OrgID string `json:"org_id"`
|
|
PersonID string `json:"person_id"`
|
|
RoleID string `json:"role_id"`
|
|
Status string `json:"status"`
|
|
JoinedAt time.Time `json:"joined_at"`
|
|
RemovedAt sql.NullTime `json:"removed_at"`
|
|
CreatedAt time.Time `json:"created_at"`
|
|
UpdatedAt time.Time `json:"updated_at"`
|
|
DisplayName string `json:"display_name"`
|
|
PrimaryEmail string `json:"primary_email"`
|
|
RoleName string `json:"role_name"`
|
|
}
|
|
|
|
func (q *Queries) GetOrgMembersByOrgID(ctx context.Context, orgID string) ([]GetOrgMembersByOrgIDRow, error) {
|
|
rows, err := q.db.QueryContext(ctx, getOrgMembersByOrgID, orgID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []GetOrgMembersByOrgIDRow{}
|
|
for rows.Next() {
|
|
var i GetOrgMembersByOrgIDRow
|
|
if err := rows.Scan(
|
|
&i.OrgMemberID,
|
|
&i.OrgID,
|
|
&i.PersonID,
|
|
&i.RoleID,
|
|
&i.Status,
|
|
&i.JoinedAt,
|
|
&i.RemovedAt,
|
|
&i.CreatedAt,
|
|
&i.UpdatedAt,
|
|
&i.DisplayName,
|
|
&i.PrimaryEmail,
|
|
&i.RoleName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Close(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listActiveMembersByOrgID = `-- name: ListActiveMembersByOrgID :many
|
|
SELECT
|
|
om.org_member_id,
|
|
om.person_id,
|
|
om.role_id,
|
|
om.joined_at,
|
|
p.display_name,
|
|
p.primary_email,
|
|
r.role_name
|
|
FROM core.org_members om
|
|
JOIN core.persons p ON p.person_id = om.person_id
|
|
JOIN core.roles r ON r.role_id = om.role_id
|
|
WHERE om.org_id = $1
|
|
AND om.status = 'active'
|
|
ORDER BY p.display_name ASC
|
|
LIMIT 200
|
|
`
|
|
|
|
type ListActiveMembersByOrgIDRow struct {
|
|
OrgMemberID string `json:"org_member_id"`
|
|
PersonID string `json:"person_id"`
|
|
RoleID string `json:"role_id"`
|
|
JoinedAt time.Time `json:"joined_at"`
|
|
DisplayName string `json:"display_name"`
|
|
PrimaryEmail string `json:"primary_email"`
|
|
RoleName string `json:"role_name"`
|
|
}
|
|
|
|
// Operator composite's Members section. Active members only (status='active',
|
|
// excluding removed/historical rows). Defensive LIMIT 200 per design D5;
|
|
// pagination is YAGNI until a real org pushes 50+ members.
|
|
func (q *Queries) ListActiveMembersByOrgID(ctx context.Context, orgID string) ([]ListActiveMembersByOrgIDRow, error) {
|
|
rows, err := q.db.QueryContext(ctx, listActiveMembersByOrgID, orgID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []ListActiveMembersByOrgIDRow{}
|
|
for rows.Next() {
|
|
var i ListActiveMembersByOrgIDRow
|
|
if err := rows.Scan(
|
|
&i.OrgMemberID,
|
|
&i.PersonID,
|
|
&i.RoleID,
|
|
&i.JoinedAt,
|
|
&i.DisplayName,
|
|
&i.PrimaryEmail,
|
|
&i.RoleName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Close(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|
|
|
|
const listActiveMembershipsByPersonID = `-- name: ListActiveMembershipsByPersonID :many
|
|
SELECT
|
|
om.org_member_id,
|
|
om.org_id,
|
|
om.role_id,
|
|
om.joined_at,
|
|
o.name AS org_name,
|
|
r.role_name
|
|
FROM core.org_members om
|
|
JOIN core.organizations o ON o.org_id = om.org_id
|
|
JOIN core.roles r ON r.role_id = om.role_id
|
|
WHERE om.person_id = $1
|
|
AND om.status = 'active'
|
|
ORDER BY om.joined_at DESC
|
|
LIMIT 200
|
|
`
|
|
|
|
type ListActiveMembershipsByPersonIDRow struct {
|
|
OrgMemberID string `json:"org_member_id"`
|
|
OrgID string `json:"org_id"`
|
|
RoleID string `json:"role_id"`
|
|
JoinedAt time.Time `json:"joined_at"`
|
|
OrgName string `json:"org_name"`
|
|
RoleName string `json:"role_name"`
|
|
}
|
|
|
|
// Person-detail "Org memberships" section. Returns each org the person
|
|
// belongs to (active memberships only) with the org's display fields and
|
|
// the person's role at that org. Sorted by joined_at DESC so the most
|
|
// recent membership appears first — operators usually want "what's the
|
|
// person doing now" rather than "where did they start."
|
|
func (q *Queries) ListActiveMembershipsByPersonID(ctx context.Context, personID string) ([]ListActiveMembershipsByPersonIDRow, error) {
|
|
rows, err := q.db.QueryContext(ctx, listActiveMembershipsByPersonID, personID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
defer rows.Close()
|
|
items := []ListActiveMembershipsByPersonIDRow{}
|
|
for rows.Next() {
|
|
var i ListActiveMembershipsByPersonIDRow
|
|
if err := rows.Scan(
|
|
&i.OrgMemberID,
|
|
&i.OrgID,
|
|
&i.RoleID,
|
|
&i.JoinedAt,
|
|
&i.OrgName,
|
|
&i.RoleName,
|
|
); err != nil {
|
|
return nil, err
|
|
}
|
|
items = append(items, i)
|
|
}
|
|
if err := rows.Close(); err != nil {
|
|
return nil, err
|
|
}
|
|
if err := rows.Err(); err != nil {
|
|
return nil, err
|
|
}
|
|
return items, nil
|
|
}
|