Skip to main content
Was this helpful?

Organization API

Organizations and Membership

List accessible organizations, manage members, and read organization-admin state

This page documents the non-admin organization surface. It excludes the admin-only organization create and delete routes and calls out the overlapping membership endpoints that exist in two controllers.

JWT or user API keyRBAC and org guardsMembership managementDeletion preview

Source

  • Main controller: backend-nestjs/src/organisations/organisations.controller.ts
  • Org admin controller: backend-nestjs/src/organisations/organisation-admin.controller.ts
  • DTOs: backend-nestjs/src/dto/organisation.dto.ts, backend-nestjs/src/dto/organisation-user.dto.ts, backend-nestjs/src/organisations/dto/update-organisation-color.dto.ts

Authentication and Permissions

  • All routes on this page require authentication.
  • The main controller uses JwtAuthGuard plus RbacAuthorizationGuard.
  • Additional route-level enforcement uses OrganisationOwnershipGuard, OrganisationAdminGuard, and organization permission decorators.
  • Admin-only routes excluded from this page:
    • POST /api/organisations
    • DELETE /api/organisations/:id
    • POST /api/organisations/:id/admins
    • DELETE /api/organisations/:id/admins/:userId

Important source note:

  • POST /api/organisations/:id/users and DELETE /api/organisations/:id/users/:userId are each defined twice, once in organisations.controller.ts and again in organisation-admin.controller.ts, with different guards and response shapes.

Endpoint Reference

Main Organization Surface

MethodPathPurposeRequest or queryAuthSource
GET/api/organisationsList organizations accessible to the current user.NoneJWT or user API keyorganisations/organisations.controller.ts
GET/api/organisations/:idGet one accessible organization.Path: idJWT or user API keyorganisations/organisations.controller.ts
PATCH/api/organisations/:idUpdate organization profile fields.Path: id, body: profile fieldsJWT or user API keyorganisations/organisations.controller.ts
POST/api/organisations/:id/usersAssign a user to the organization.Path: id, body: userIdJWT or user API keyorganisations/organisations.controller.ts
DELETE/api/organisations/:id/users/:userIdRemove a user from the organization.Path: id,userIdJWT or user API keyorganisations/organisations.controller.ts
POST/api/organisations/:id/users/assignAssign a user with an explicit role.Path: id, body: userId,role,assignedByIdJWT or user API keyorganisations/organisations.controller.ts
GET/api/organisations/:id/users/listList organization users and roles.Path: idJWT or user API keyorganisations/organisations.controller.ts
PATCH/api/organisations/:id/users/:userId/roleUpdate a member role.Path: id,userId, body: roleJWT or user API keyorganisations/organisations.controller.ts
DELETE/api/organisations/:id/users/:userId/removeRemove a member through the alternate removal path.Path: id,userIdJWT or user API keyorganisations/organisations.controller.ts
GET/api/organisations/:id/deletion-previewPreview cascade deletion impact.Path: idJWT or user API keyorganisations/organisations.controller.ts
DELETE/api/organisations/:id/cascadeCascade-delete organization-owned data.Path: idJWT or user API keyorganisations/organisations.controller.ts
PATCH/api/organisations/:id/colorUpdate organization color.Path: id, body: color,cascadeToResourceTypesJWT or user API keyorganisations/organisations.controller.ts

Organization Admin Helper Surface

MethodPathPurposeRequest or queryAuthSource
GET/api/organisations/:id/adminsList organization admins.Path: idJWT or user API keyorganisations/organisation-admin.controller.ts
POST/api/organisations/:id/usersAdd a user to the organization.Path: id, body: userIdJWT or user API keyorganisations/organisation-admin.controller.ts
DELETE/api/organisations/:id/users/:userIdRemove a user from the organization.Path: id,userIdJWT or user API keyorganisations/organisation-admin.controller.ts
GET/api/organisations/:id/usersList organization users.Path: idJWT or user API keyorganisations/organisation-admin.controller.ts
GET/api/organisations/admin-rolesList organizations where the current user is an admin.NoneJWT or user API keyorganisations/organisation-admin.controller.ts
GET/api/organisations/:id/admin-statusTest whether the current user is an organization admin.Path: idJWT or user API keyorganisations/organisation-admin.controller.ts

Request Shapes

Organization profile

CreateOrganisationDto and UpdateOrganisationDto in backend-nestjs/src/dto/organisation.dto.ts

  • name: required on create
  • description: optional string
  • address: optional string
  • phone: optional string
  • email: optional email
  • isActive: update-only optional boolean

Membership

  • AssignUserDto.userId: required number
  • AssignOrganisationUserDto.userId: required number
  • AssignOrganisationUserDto.role: required OrganisationRoleType
  • AssignOrganisationUserDto.assignedById: optional number
  • UpdateOrganisationUserRoleDto.role: required OrganisationRoleType

Color

UpdateOrganisationColorDto

  • color: required hex color, #rgb or #rrggbb
  • cascadeToResourceTypes: optional boolean

Example Calls

List accessible organizations

curl "$PRIMECAL_API/api/organisations" \
-H "Authorization: Bearer $TOKEN"

Assign a user with a role

curl -X POST "$PRIMECAL_API/api/organisations/12/users/assign" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"userId": 42,
"role": "ADMIN"
}'

Update the organization color

curl -X PATCH "$PRIMECAL_API/api/organisations/12/color" \
-H "Authorization: Bearer $TOKEN" \
-H "Content-Type: application/json" \
-d '{
"color": "#14b8a6",
"cascadeToResourceTypes": true
}'

Response and Behavior Notes

  • GET /api/organisations returns only organizations the current user can access.
  • Some routes in the organization-admin controller return { message, data } envelopes instead of plain entities.
  • GET /api/organisations/:id/deletion-preview should be used before destructive cascade operations.

Best Practices

  • Treat the duplicate :id/users routes as overlapping surfaces and standardize your client on one path family.
  • Use GET /api/organisations/:id/users/list or GET /api/organisations/:id/users consistently instead of mixing both in the same client.
  • Always preview cascade deletion before calling DELETE /api/organisations/:id/cascade.
  • Prefer role-specific membership updates with /users/assign and /users/:userId/role instead of remove-and-readd workflows.