package main import ( "context" "database/sql" "atlas9.dev/c/core" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" "atlas9.dev/c/core/routes" ) type GrantApi struct { DB *sql.DB Grants dbi.Factory[iam.GrantStore] } type AddGrantRes struct{} type RemoveGrantRes struct{} type ListGrantsReq struct { PrincipalID core.ID Page core.PageReq } type ListGrantsRes core.Page[iam.Grant] func (s *GrantApi) Add(ctx context.Context, req iam.Grant) (*AddGrantRes, error) { return dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) (*AddGrantRes, error) { return &AddGrantRes{}, s.Grants(tx).Add(ctx, req) }) } func (s *GrantApi) Remove(ctx context.Context, req iam.Grant) (*RemoveGrantRes, error) { return dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) (*RemoveGrantRes, error) { return &RemoveGrantRes{}, s.Grants(tx).Remove(ctx, req) }) } func (s *GrantApi) List(ctx context.Context, req ListGrantsReq) (*ListGrantsRes, error) { page, err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (core.Page[iam.Grant], error) { return s.Grants(tx).List(ctx, req.PrincipalID, req.Page) }) if err != nil { return nil, err } res := ListGrantsRes(page) return &res, nil } type ListAllGrantsRes core.Page[iam.Grant] func (s *GrantApi) ListAll(ctx context.Context, req core.PageReq) (*ListAllGrantsRes, error) { page, err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (core.Page[iam.Grant], error) { return s.Grants(tx).ListAll(ctx, req) }) if err != nil { return nil, err } res := ListAllGrantsRes(page) return &res, nil } type ListGrantsByNamespaceReq struct { Namespace string Page core.PageReq } func (s *GrantApi) ListByNamespace(ctx context.Context, req ListGrantsByNamespaceReq) (*ListAllGrantsRes, error) { page, err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (core.Page[iam.Grant], error) { return s.Grants(tx).ListByNamespace(ctx, req.Namespace, req.Page) }) if err != nil { return nil, err } res := ListAllGrantsRes(page) return &res, nil } func GrantRoutes(svc *GrantApi) []routes.Route { return []routes.Route{ routes.RPC("/grants/add", svc.Add), routes.RPC("/grants/remove", svc.Remove), routes.RPC("/grants/list", svc.List), routes.RPC("/grants/list-all", svc.ListAll), routes.RPC("/grants/list-by-namespace", svc.ListByNamespace), } }