package api import ( "database/sql" "net/http" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" "atlas9.dev/c/demo/lib" ) type TenantMembersImpl struct { DB *sql.DB Guard lib.Guard Members dbi.Factory[iam.TenantMemberStore] } func (s *TenantMembersImpl) Remove(w http.ResponseWriter, r *http.Request) { // Read and validate the request body var req TenantMembers_RemoveReq if read(w, r, &req) { return } // Check access if check(w, r, s.Guard, iam.CapTenantMembersRemove, req.Tenant, "") { return } // Remove from the database ctx := r.Context() err := dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) error { return s.Members(tx).Remove(ctx, req.Tenant, req.UserID) }) write(ctx, w, err, nil) } func (s *TenantMembersImpl) Get(w http.ResponseWriter, r *http.Request) { // Read and validate the request body var req TenantMembers_GetReq if read(w, r, &req) { return } // Check access if check(w, r, s.Guard, iam.CapTenantMembersRead, req.Tenant, "") { return } // Get member from database ctx := r.Context() var member iam.TenantMember err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) error { return s.Members(tx).Get(ctx, req.Tenant, req.UserID, &member) }) write(ctx, w, err, member) } func (s *TenantMembersImpl) ListByTenant(w http.ResponseWriter, r *http.Request) { // Read and validate the request body var req TenantMembers_ListByTenantReq if read(w, r, &req) { return } // Check access if check(w, r, s.Guard, iam.CapTenantMembersRead, req.Tenant, "") { return } // Load the data from the database ctx := r.Context() var res TenantMembers_ListRes err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) error { return s.Members(tx).List(ctx, req.Tenant, req.Page, &res.Page) }) write(ctx, w, err, res) } func (s *TenantMembersImpl) ListByUser(w http.ResponseWriter, r *http.Request) { // Read and validate the request body var req TenantMembers_ListByUserReq if read(w, r, &req) { return } // Listing members by user is a cross-tenant operation, // which makes access checks non-trivial, so there's no access check here. /// See the tenant member store for details. // Load the data from the database ctx := r.Context() var res TenantMembers_ListByUserRes err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) error { return s.Members(tx).ListByUser(ctx, req.UserID, req.Page, &res.Page) }) write(ctx, w, err, res) }