Launchpad MP (501314) - r00ta/openfga-users-to-groups-endpoints#439
Open
r00tabot wants to merge 1 commit intoSpaghettiHub:masterfrom
Open
Launchpad MP (501314) - r00ta/openfga-users-to-groups-endpoints#439r00tabot wants to merge 1 commit intoSpaghettiHub:masterfrom
r00tabot wants to merge 1 commit intoSpaghettiHub:masterfrom
Conversation
There was a problem hiding this comment.
Pull request overview
Adds user↔group membership support across MAAS’ service layer and both API surfaces (legacy v2 + FastAPI v3) by introducing a SQL view over OpenFGA tuples joined to auth_user, plus the corresponding repositories/services/handlers and tests. It also adjusts migration ordering so OpenFGA built-in migrations run before Alembic, and prevents internal/system users from being auto-assigned to groups.
Changes:
- Introduce
maasserver_usergroup_members_view(OpenFGA tuples → user/group membership) and a read-only repository/model for querying it. - Add service-layer methods and v2/v3 API endpoints to list/add/remove group members, including “already in group” conflict handling.
- Run OpenFGA built-in migrations before Alembic and skip auto-adding system users to default groups.
Reviewed changes
Copilot reviewed 26 out of 27 changed files in this pull request and generated 5 comments.
Show a summary per file
| File | Description |
|---|---|
| src/maasservicelayer/db/alembic/versions/0020_create_maasserver_user_group_membership.py | Adds Alembic migration to create the user↔group membership view. |
| src/maasservicelayer/db/repositories/usergroups_members.py | New read-only repository + clause factory for querying membership view. |
| src/maasservicelayer/db/tables.py | Adds SQLAlchemy table definition for maasserver_usergroup_members_view. |
| src/maasservicelayer/exceptions/constants.py | Adds a new exception “type” constant for conflict responses. |
| src/maasservicelayer/models/usergroup_members.py | New service-layer model representing a group member row. |
| src/maasservicelayer/services/init.py | Wires UserGroupMembersRepository into the service collection. |
| src/maasservicelayer/services/openfga_tuples.py | Adds tuple deletion helper for removing a user from a group. |
| src/maasservicelayer/services/usergroups.py | Adds membership methods (list/add/remove) + “already member” detection. |
| src/maasapiserver/v3/api/public/handlers/usergroups.py | Adds v3 endpoints: GET/POST/DELETE /groups/{id}/members[...] with conflict handling. |
| src/maasapiserver/v3/api/public/models/requests/usergroup_members.py | New request model for adding a member by user_id. |
| src/maasapiserver/v3/api/public/models/responses/usergroup_members.py | New v3 response models for member list payloads. |
| src/maasopenfga/internal/migrations/00002_migrate_environments.go | Skips internal users when bulk-assigning users to groups during OpenFGA migration. |
| src/maasserver/api/usergroups.py | Adds v2 ops: list_members, add_member, remove_member. |
| src/maasserver/api/tests/test_usergroups.py | Adds v2 API tests covering membership operations and permissions. |
| src/maasserver/exceptions.py | Adds a v2 API exception for “already a member” conflict (409). |
| src/maasserver/management/commands/dbupgrade.py | Runs OpenFGA migrations before Alembic migrations. |
| src/maasserver/models/signals/tests/test_users.py | Adds signal tests ensuring system users are not auto-assigned to groups. |
| src/maasserver/models/signals/users.py | Prevents system users from being auto-added to default groups on create. |
| src/maasserver/testing/factory.py | Adds make_Usergroup() test factory using the service layer. |
| src/maasserver/testing/initial.maas_test.sql | Updates test DB snapshot with the new view + bumps alembic version. |
| src/tests/fixtures/factories/user.py | Makes test users use randomized usernames/emails by default. |
| src/tests/maasapiserver/v3/api/public/handlers/test_usergroups.py | Adds v3 handler tests for membership endpoints and conflict/notfound cases. |
| src/tests/maasservicelayer/db/repositories/test_usergroups_members.py | New repository tests for membership view filtering/listing. |
| src/tests/maasservicelayer/db/test_views.py | Adds the new view to the “all views usable” test. |
| src/tests/maasservicelayer/services/test_openfga_tuples.py | Adds test for removing a user-from-group tuple deletion. |
| src/tests/maasservicelayer/services/test_usergroups.py | Extends service tests for membership add/list/remove and “already member” behavior. |
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
src/maasservicelayer/db/alembic/versions/0020_create_maasserver_user_group_membership.py
Show resolved
Hide resolved
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
This is autogenerated by maas.r00ta.com. Enjoy!
Commit message: feat: add v2 and v3 API usergroup membership endpoints
Details: