# Hvis du vil skrive KontaktRum selv

Teknisk opskrift til en kodeagent. Byg en selvstændig installation ud fra funktionskravene her. Vælg selv programmeringssprog, databasebibliotek og frontendteknik.

KontaktRum er et visuelt mødebord mellem en virksomhed og dens kunder. Ejeren organiserer projekter på arbejdsflader med tekst, filer, billeder, links og handlinger. Ejeren vælger, hvad kunden må se, udgiver et privat link og får kundens kommentarer ved det konkrete materiale. En særskilt samarbejdsarbejdsflade kan også lade kunden bidrage.

## Installation og datagrænse

- Byg en serverapp til Linux, som kan køre bag en HTTPS-reverse-proxy. Lever en installationsvejledning, systemd-eksempel og eksempel på proxyopsætning. Appen lytter lokalt; domæne, certifikat og backup hører til operatørens server.
- Gem projekter, arbejdsflader, elementer, kommentarer, links og sessioner som vedvarende data. SQLite er velegnet. Gem store uploadede filer i en privat datamappe uden for webroden. En backup skal omfatte både database og filer fra samme konsistente tidspunkt.
- En selvstændig installation har ét ejerlogin med en stærk adgangskode. Beskyt administration og private API'er. Brug sikre sessioncookies over HTTPS, udløb og logout. Valider anmodningers oprindelse ved skrivehandlinger. Den offentlige forside og aktive kundelinks kan åbnes uden ejerlogin.
- Giv projekter, arbejdsflader, elementer og links stabile ID'er. Gem hver ændring som en begrænset opdatering i en transaktion. Ved konkurrerende ændringer af samme felt skal begge værdier bevares, indtil ejeren vælger; ændringer af forskellige elementer kan samles. Bevar en lokal kladde ved netværksfejl.

## Ejerens arbejdsflade

Ejeren kan oprette et projekt med flere arbejdsflader. En arbejdsflade er et frit lærred med panorering, zoom, gitter og flytbare elementer. Egenskaber for det valgte element vises i et panel. Et element kan være tekst, note, overskrift, handling, tidslinje, referat, link, billede, PDF eller website. Et referat kan rumme længere mødenoter. En handling har status; en tidslinje har flere daterede linjer. Ejeren kan også samle henvendelser og idéer i en indbakke og placere dem på et lærred.

Et element har stabil identitet, type, position, størrelse, indhold, eventuelt fil-id, link og synlighed. Valgt element kan stå i URL'en, så genindlæsning samt browserens Tilbage og Frem vender tilbage til det samme. Uploadede PDF'er og billeder må ikke blandes ind i en stor JSON-tilstand. Serveren skal kontrollere filtype og størrelse og udlevere private filer gennem kontrollerede ruter.

## Kundens private visning

Ejeren vælger pr. element <code>privat</code>, <code>synligt</code> eller <code>maskeret</code>. Et maskeret element kan vise en særskilt titel og et kort uddrag. Ejeren vælger også de arbejdsflader, der skal med. Vis en intern forhåndsvisning af præcis det udvalgte indhold før udgivelse.

Når ejeren udgiver, oprettes en afgrænset publiceringskopi og et tilfældigt link med mindst 256 bits entropi, for eksempel <code>/s/{token}/</code>. Kundens side læser kun publiceringskopien; den må ikke få adgang til private elementer, interne API'er eller kildedata. Gemte ændringer på ejerens lærred kommer først på dette link efter en ny udgivelse. Ejeren kan opdatere kopien på samme adresse og lukke linket, så både side og filer afvises straks.

Kunden kan sætte en kommentar ved et sted på den udgivne arbejdsflade, rette den og flytte den. Gem kommentaren særskilt fra ejerens projektdata. En browser kan få en afgrænset nøgle til sine egne kommentarer; den må ikke kunne rette andres. Ejeren ser svarene i projektet og på lærredet. Vis ikke kundekommentarer til andre gæster uden en udtrykkelig publicering.

## Samarbejdsarbejdsflade

Tilbyd en særskilt type arbejdsflade, hvor ejeren kan oprette et privat <code>/c/{token}/</code>-link med enten læseadgang eller bidragsadgang. En bidragyder kan lave en lokal kladde og trykke "Del på board". Først da bliver elementet synligt for de øvrige deltagere. Nye elementer og ændringer hentes løbende fra serveren. En læsemarkering er en lokal browserindstilling, ikke en personidentitet eller kvittering.

Ejeren kan rette og fjerne alle bidrag. En bidragyder kan kun rette egne bidrag fra en browser, der har den tilhørende redigeringsnøgle. Kontroller denne ret på serveren ved hver skrivehandling. Et lukket link stopper besøg, nye bidrag og adgang til de filer, der blev delt gennem linket. Filer leveres kun gennem aktive links og gyldige elementreferencer. Generelle dokumentfiler kan hentes som download; de må ikke afvikles som HTML i KontaktRums domæne.

## Valgfri websiteoptagelse

Et website-element har en offentlig HTTPS-adresse og kan vise desktop-, tablet- og mobilbilleder. Integrationen med en separat WebSnap-server er valgfri. KontaktRum sender bestillingen fra serveren med et privat token, henter de færdige PNG-filer og gemmer kopier i sin egen datamappe. Tokenet må ikke sendes til browseren eller gemmes i projektets offentlige data. Mens jobbet kører, vises status; ved fejl beholdes et tidligere gyldigt billede. Uden WebSnap skal projekter, deling og kommentarer stadig fungere.

## Accept

- En ny installation med tom datamappe kan oprette ejerlogin, projekt, to arbejdsflader og flere elementer. Efter genstart er indhold og filer bevaret.
- To ejervinduer kan gemme ændringer i forskellige elementer. En konflikt i samme felt viser begge værdier og mister ingen kladde.
- En publiceringskopi indeholder kun valgte arbejdsflader og synlige elementer. Et maskeret element røber ikke sit private indhold i HTML, JSON eller filruter.
- En kundeadresse viser den senest udgivne kopi, indtil ejeren udgiver igen. Lukning af linket afviser straks side, kommentarer og filer.
- Kundens kommentar vises hos ejeren. En anden browser kan ikke ændre den uden den korrekte afgrænsede nøgle.
- Et samarbejdslink med læseadgang kan ikke oprette eller rette elementer. En bidragyder kan kun ændre egne elementer. Filer fra et lukket link kan ikke hentes.
- Installation uden WebSnap fungerer. Tilslutning af WebSnap giver tre billedvisninger, og et fejlet nyt job sletter ikke det tidligere billede.
- En gendannelse af samlet database og filmappe giver samme projekter, aktive links og kommentarer.
