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 RoleApi struct { DB *sql.DB Roles dbi.Factory[iam.RoleStore] } type GetRoleReq struct { ID iam.RoleID } type DeleteRoleReq struct { ID iam.RoleID } type DeleteRoleRes struct{} func (s *RoleApi) Save(ctx context.Context, req iam.Role) (*iam.Role, error) { _, err := dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) (bool, error) { return s.Roles(tx).Save(ctx, &req) }) if err != nil { return nil, err } return &req, nil } func (s *RoleApi) Get(ctx context.Context, req GetRoleReq) (*iam.Role, error) { return dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (*iam.Role, error) { return s.Roles(tx).Get(ctx, req.ID) }) } func (s *RoleApi) Delete(ctx context.Context, req DeleteRoleReq) (*DeleteRoleRes, error) { return dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) (*DeleteRoleRes, error) { return &DeleteRoleRes{}, s.Roles(tx).Delete(ctx, req.ID) }) } type ListRolesReq struct { Page core.PageReq } type ListRolesRes core.Page[iam.Role] func (s *RoleApi) List(ctx context.Context, req ListRolesReq) (*ListRolesRes, error) { page, err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (core.Page[iam.Role], error) { return s.Roles(tx).List(ctx, req.Page) }) if err != nil { return nil, err } res := ListRolesRes(page) return &res, nil } type ListRolesByNamespaceReq struct { Namespace string Page core.PageReq } func (s *RoleApi) ListByNamespace(ctx context.Context, req ListRolesByNamespaceReq) (*ListRolesRes, error) { page, err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) (core.Page[iam.Role], error) { return s.Roles(tx).ListByNamespace(ctx, req.Namespace, req.Page) }) if err != nil { return nil, err } res := ListRolesRes(page) return &res, nil } func RoleRoutes(svc *RoleApi) []routes.Route { return []routes.Route{ routes.RPC("/roles/save", svc.Save), routes.RPC("/roles/get", svc.Get), routes.RPC("/roles/delete", svc.Delete), routes.RPC("/roles/list", svc.List), routes.RPC("/roles/list-by-namespace", svc.ListByNamespace), } }