feat(backend+frontend): edit-person-Berechtigung fuer Personen-Edit in Personen-Ansicht + Gruppen-Mitglieder #195
Labels
No labels
component/backend
component/docs
component/e2e
component/frontend
component/infra
component/keycloak
prio/high
prio/low
prio/medium
type/bug
type/chore
type/feature
type/refactor
type/test
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
WompSchmiede/FamilienFeierPlaner#195
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Einordnung
Beschreibung
User mit
edit-person-Realm-Rolle sollen Personen aus der Personen-Ansicht (/app/persons) und aus der Gruppen-Detailseite (/app/groups/{id}) editieren koennen.Das Editieren erfolgt via
PersonEditModal— einem generischen Modal fuer Stammdaten + Kontaktdaten, das von beiden Views genutzt wird.Wichtig: Der "Bearbeiten"-Button wird NICHT als Inline-Button realisiert, sondern als Eintrag im
ActionMenu(siehe #193). Dies setzt #193 voraus.Teil 1: Backend — Auth-Lockerung
Ist-Zustand
PUT /api/v1/persons/:person_id(Stammdaten)requireAuth + requireOwnData('person_id')PUT /api/v1/persons/:person_id/contacts(Kontaktdaten)requireAuth + requireOwnDataOrGroupMember('person_id')Soll-Zustand
PUT /api/v1/persons/:person_idrequireAuth + requireOwnDataOrCompositeRole('edit-person', 'person_id')edit-person-RollePUT /api/v1/persons/:person_id/contactsrequireAuth + requireOwnDataOrGroupMemberOrCompositeRole('edit-person', 'person_id')edit-person-RolleDie Account-Seite (
/app/account) nutzt denselbenPUT /api/v1/persons/:person_id-Endpunkt. Da sie immerlocals.user.personIdsendet, ist sie von der Auth-Aenderung nicht betroffen (derrequireOwnData-Check laeuft durch).Aenderungen
backend/src/lib/auth.ts— Neuer HookrequireOwnDataOrGroupMemberOrCompositeRole(permission, personIdParam):request.user.personId === targetPersonId, (b) GroupMember-Lookup gleiche groupId, (c)request.user.roles.includes(permission)backend/src/routes/persons.ts:333— preHandler aendern:backend/src/routes/contacts.ts:83— preHandler aendern:docs/design/03-autorisierungsmatrix.md— Zeilen 30+32 aktualisierenTeil 2: Backend-Tests
backend/src/__tests__/persons.test.ts— Testfall ergaenzen: User mitedit-person-Realm-Rolle darf fremde Person editieren (200)backend/src/__tests__/contacts.test.ts— Testfall ergaenzen: User mitedit-person-Realm-Rolle darf fremde Kontaktdaten editieren (200)edit-person-Rolle darf fremde Person NICHT editieren (403)Teil 3: Frontend — PersonEditModal (generisch)
frontend/src/lib/components/person-edit-modal.svelte(neu)Selbstaendiges Modal, das von jeder Seite eingebunden werden kann:
Verhalten:
open === true:$effectruftGET /api/v1/persons/{personId}/contactsaufuse:enhanceauf?/editPersononClose()+window.location.reload()Layout (vorgesehen):
Teil 4: Frontend — Personen-Ansicht
frontend/src/routes/app/persons/+page.svelteeditingPerson = rowsetztfrontend/src/routes/app/persons/+page.server.tsNeue Action
editPerson(identisch zu account?/contacts+?/person, aber mit beliebiger personId):Teil 5: Frontend — Gruppen-Mitglieder
frontend/src/routes/app/groups/[groupId]/+page.svelteeditingPersonanalog zur Personen-AnsichtPersonEditModalam Ende der SeiteGROUP_MEMBER_COLUMNSaus #198 (zentrale Spalten + Consent)frontend/src/routes/app/groups/[groupId]/+page.server.tsIdentische
editPerson-Action wie in persons (gleiche API-Aufrufe).Dokumentation
docs/design/04-frontend-architektur.mdPersonEditModalin den neuen "Modals/Dialoge"-Abschnitt eintragen (siehe #193).frontend/src/tests/persons.test.tsTest fuer
editPerson-Action ergaenzen:frontend/src/tests/groups.test.tsTest fuer
editPerson-Action ergaenzen.Dateien (vollstaendig)
backend/src/lib/auth.tsrequireOwnDataOrGroupMemberOrCompositeRolebackend/src/routes/persons.tsrequireOwnData→requireOwnDataOrCompositeRolebackend/src/routes/contacts.tsrequireOwnDataOrGroupMember→...OrCompositeRoledocs/design/03-autorisierungsmatrix.mdfrontend/src/lib/components/person-edit-modal.sveltefrontend/src/routes/app/persons/+page.sveltefrontend/src/routes/app/persons/+page.server.tseditPersonfrontend/src/routes/app/groups/[groupId]/+page.sveltefrontend/src/routes/app/groups/[groupId]/+page.server.tseditPersonfrontend/src/tests/persons.test.tsfrontend/src/tests/groups.test.tsbackend/src/__tests__/persons.test.tsbackend/src/__tests__/contacts.test.tsfeat(backend+frontend): edit-person-Berechtigung fuer Personen-Edit in Personen-Ansichtto feat(backend+frontend): edit-person-Berechtigung fuer Personen-Edit in Personen-Ansicht + Gruppen-Mitglieder