Synlighet mellan ägare — relationer med platsavgränsning (spec 2 av 2)
Created: Wed 15 Jul 2026 10:22:53 CEST Updated: Thu 16 Jul 2026 06:50:12 CEST — Korrekta ägarförhållanden i Långudden-scenariot (Paul 2026-07-16): de sex delägarna är Paul, Katja, Elisabeth, Nina, Kåre och Leiv; ägaren Långudden äger både marken och sommarstället Saltsjön. Document Version: 1.0 — utkast efter brainstorm med Paul 2026-07-15 Security Classification: Internal Technical Documentation Target Audience: Backend, iOS, Web Author: Paul Wisén (design), Claude (spec)
Systerspec:
2026-07-15-owner-invitations-and-transfers-design.md(byggs FÖRE denna). Denna spec designas nu för att arkitekturen ska hänga ihop, men implementeras som steg 2.
Sammanfattning
I dag är synlighet binär: medlem i ägaren ser allt, alla andra ser bara den publika skanningsvyn (namn, bild, status, ägarnamn, grov ~1 km-position — och bara med taggen i handen). Detta bygger relationer mellan ägare: en givare delar sina objekt med en mottagare på en nivå (Vän/Nära), valfritt avgränsat till en platsrot. Mottagarens medlemmar ärver relationen. Under huven är nivåerna buntar av kapabiliteter, så förfining senare (egna grupper, zon-undantag, “får låna/sälja”) kräver ingen ombyggnad.
Styrande scenarier (blir publika use-cases)
- Göran (Vän): Paul ser att Görans verktyg finns — men inte exakt var, utan att fråga.
- Långudden/Kåre (Nära, platsavgränsad, grupp): sex delägare — Paul, Katja, Elisabeth, Nina, Kåre och Leiv — samäger marken och sommarstället Saltsjön (ägaren Långudden äger det gemensamma; var och en äger sitt). Kåre delar sina saker under Saltsjön med Paul (eller hela Långudden) — Paul ser dem direkt, inklusive var de är. Kåres garage i Luleå förblir osynligt.
- Förskolan (Nära, platsavgränsad, organisation): Familjen delar sina saker under förskolans plats med ägaren Förskolan. Läraren Camilla skannar Kalles jacka och ser att den är Kalles och att dess normala plats är “Kalles plats i kapprummet”. Omvänt behöver familjen placerings-rätt på förskolans plats (kapabiliteten får lägga in objekt — byggs inte i v1 men bärs av modellen).
- VD-rummet (framtida zon-undantag, INOM en ägare): alla anställda ser verkstadens verktyg, men inte innehållet i VD:ns rum — utom saker som hör hemma i verkstaden och bara står (CURRENT) hos VD:n: de syns. Byggs inte nu; principen låser arkitekturvalet (per-objekt-kontroll, NORMAL/CURRENT-axeln).
Datamodell (Postgres)
Ny tabell owner_relations:
| Kolumn | Typ | Anm |
|---|---|---|
id |
uuid PK | |
grantor_organization_id |
uuid FK | givaren (vars objekt delas) |
grantee_organization_id |
uuid FK | mottagaren (vars medlemmar ärver) |
level |
text CHECK ‘friend’/’close’ | UI: Vän / Nära |
scope_root_object_id |
uuid NULL | platsrot; NULL = allt givaren äger |
created_by / created_at |
uuid / timestamptz | owner-grindad på givaren |
- Flera relationer mellan samma par med olika platsrötter är tillåtet (unik på (grantor, grantee, scope)).
- Återkallas genom radering. Inget accept-steg: att ge synlighet är en gåva utan förpliktelse; mottagaren kan dölja/ignorera (framtida “dölj delning”-inställning om behov uppstår).
- Personlig vänskap och grupp är samma rad: mottagaren är en personlig ägare (Kåre → Paul) eller en gruppägare (Kåre → Långudden).
Nivåer och kapabiliteter
Mappningen nivå → kapabiliteter ligger i kod (konstant i Plings-API), inte i schemat — nya nivåer/egna grupper senare är kod, inte migration:
| Kapabilitet | Vän | Nära | Medlem (idag) |
|---|---|---|---|
| Ser existens (namn, bild, status, ägare) | ✅ | ✅ | ✅ |
| Ser grov plats (~1 km, som publika vyn) | ✅ | ✅ | ✅ |
| Ser exakt plats + platsträd + senast sedd | — | ✅ | ✅ |
| Får låna (framtida mekanik, reserveras) | — | (✅) | ✅ |
| Får lägga in objekt (placeringsrätt, framtida) | — | — | ✅ |
| Redigera/flytta/sälja/överlämna | — | — | ✅ (owner) |
Platsrotens semantik (NORMAL/CURRENT-reglerna)
Relationen med platsrot R täcker givarens objekt som:
- Hör hemma under R (
NORMAL_IN-subträd): syns även när de är borta — men exakt CURRENT-position visas bara medan objektet står under R. Utanför R maskas positionen till “inte på plats” (skyddar Kåres hemadress i Luleå och familjens hem i förskole-fallet). Det här är låne-informationen: “borren finns, Kåre har tagit hem den”. - Står under R tillfälligt (
CURRENT_INunder R, NORMAL utanför): syns medan de står där, försvinner när de åker hem.
Utan platsrot (NULL) gäller relationen allt givaren äger, med nivåns kapabiliteter.
Frågeytor (Plings-API)
- Navigator/listor: det du ser = dina ägares objekt ∪ relationsobjekten. Ny resolver-term: för varje relation där anroparen är medlem i mottagaren → givarens objekt filtrerade genom platsroten (Neo4j-subträdstraversering, samma mönster som befintliga subträdsfrågor) och projicerade genom nivåns kapabilitetsfilter (Vän: grov position, inget platsträd).
- Tagg-uppslag & skanning:
getObjectByTag/skanningsflödet utökas att hedra relationer, inte bara medlemskap — annars ser Camilla bara främlingsvyn trots relationen. (Skanning loggar som vanligt; läs-uppslag förblir läs.) - Objektdetalj (
object(id)): samma kapabilitetsfilter; Vän-nivå får detaljkortet med maskad plats. - Kapabilitetskontrollen implementeras som en per-objekt-funktion (viewer, object) → kapabilitetsmängd — så att VD-rummets zon-term senare blir ytterligare en term i funktionen, inte en ny mekanism.
UI (Plings-iOS, v1)
- I platsträdet: relationsobjekt dyker upp där de hör hemma (Kåres saker i Saltsjöns träd), märkta med ägare. Ni delar ju träd — det är den naturliga presentationen.
- “Delat med mig”: vy per givare för relationer utan gemensamt träd (Göran-fallet).
- “Dela med …” på ägar-skärmen: välj mottagar-ägare (v1: ägare vars medlemmar man delar någon ägare med, eller via mejllänk på invite-infran) → nivå → ev. platsrot (platsväljare = befintliga trädväljaren).
- Klarspråk: “Vän” / “Nära” / “Delat med mig” / “Delas med …”.
Avgränsningar v1
- Inga egna kapabilitetsgrupper (nivåerna räcker; grunden gör dem billiga senare).
- Ingen zon-/objektnivåbehörighet inom en ägare (VD-rummet) — principen dokumenterad ovan.
- Ingen låne-/placeringsmekanik — kapabiliteterna reserverade.
- Publika skanningsvyn oförändrad (främlingsnivån ligger fast).
- Beslut att ta i implementationen: den publika vyn serverar i dag huvudbilden utan att konsultera
object_images.is_public— avgörs medvetet här (trolig fix: hedra flaggan).
Öppna frågor (utflöden)
- Ska mottagaren notifieras när någon delar med hen? (Trolig ja — mail via Resend-infran; egen liten slice.)
- Vän-nivåns exakta fältmängd på detaljkortet (visa mallinfo? senast sedd-tidsstämpel utan plats?) — finjusteras vid implementation med Pauls klick-igenom.
- Egna grupper/nivåer (“Får se plats” à la carte) — Backlog tills verkligt behov.