package api_impl import ( "database/sql" "net/http" "atlas9.dev/c/core/dbi" "atlas9.dev/c/core/iam" "atlas9.dev/c/demo/api" "atlas9.dev/c/demo/lib/access" ) type UserGrantsImpl struct { DB *sql.DB Guard access.Guard Grants dbi.Factory[iam.UserGrantStore] Audit dbi.Factory[iam.AuditStore] } func (s *UserGrantsImpl) ServeMux(mux *http.ServeMux) { mux.HandleFunc(api.Path_UserGrants_Add, s.Add) mux.HandleFunc(api.Path_UserGrants_Remove, s.Remove) mux.HandleFunc(api.Path_UserGrants_ListByTenant, s.ListByTenant) mux.HandleFunc(api.Path_UserGrants_ListByUser, s.ListByUser) } func (s *UserGrantsImpl) Add(w http.ResponseWriter, r *http.Request) { var req api.UserGrants_AddReq if read(w, r, &req) { return } if check(w, r, s.Guard, iam.CapGrantsAdd, req.Grant.Tenant, "") { return } ctx := r.Context() err := dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) error { if err := s.Grants(tx).Add(ctx, req.Grant); err != nil { return err } return audit(ctx, s.Audit(tx), iam.AuditEntry{ Tenant: req.Grant.Tenant, Action: "UserGrants_Add", Resource: req.Grant.User.String(), Detail: req.Grant.Role, }) }) write(ctx, w, err, nil) } func (s *UserGrantsImpl) Remove(w http.ResponseWriter, r *http.Request) { var req api.UserGrants_RemoveReq if read(w, r, &req) { return } if check(w, r, s.Guard, iam.CapGrantsRemove, req.Grant.Tenant, "") { return } ctx := r.Context() err := dbi.ReadWrite(ctx, s.DB, func(tx dbi.DBI) error { if err := s.Grants(tx).Remove(ctx, req.Grant); err != nil { return err } return audit(ctx, s.Audit(tx), iam.AuditEntry{ Tenant: req.Grant.Tenant, Action: "UserGrants_Remove", Resource: req.Grant.User.String(), Detail: req.Grant.Role, }) }) write(ctx, w, err, nil) } func (s *UserGrantsImpl) ListByTenant(w http.ResponseWriter, r *http.Request) { var req api.UserGrants_ListByTenantReq if read(w, r, &req) { return } if check(w, r, s.Guard, iam.CapGrantsList, req.Tenant, "") { return } ctx := r.Context() var res api.UserGrants_ListByTenantRes err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) error { page, err := s.Grants(tx).ListByTenant(ctx, req.Tenant, req.Page) res.Page = page return err }) write(ctx, w, err, res) } func (s *UserGrantsImpl) ListByUser(w http.ResponseWriter, r *http.Request) { var req api.UserGrants_ListByUserReq if read(w, r, &req) { return } if checkSystem(w, r, s.Guard, iam.CapGrantsList) { return } ctx := r.Context() var res api.UserGrants_ListByUserRes err := dbi.ReadOnly(ctx, s.DB, func(tx dbi.DBI) error { page, err := s.Grants(tx).ListByUser(ctx, req.User, req.Page) res.Page = page return err }) write(ctx, w, err, res) }