14 KiB
HemHub – Sammanfattning av färdiga features
Detta dokument sammanfattar de features som är färdiga, verifierade och mergade till main.
Syftet är att ge ChatGPT, Codex och andra arbetsdialoger en kompakt överblick över projektets historik utan att samtliga fullständiga featuredokument behöver finnas som aktiva projektkällor.
De fullständiga och bindande historiska dokumenten finns fortsatt under:
docs/features/
Repositoryts aktuella kod, tester, docs/architecture.md, docs/roadmap.md, relevanta ADR:er och respektive fullständiga featuredokument har alltid företräde framför denna sammanfattning.
Aktuellt läge
Feature 0–8 är färdiga, verifierade och mergade till main.
Nästa planerade produktfeature är:
Feature 9 – Deadline
Den aktuella applikationen har:
- React/Vite-frontend och Spring Boot-backend i ett monorepo;
- centralt lagrade användare och ett lokalt browserval av aktiv användare;
- en gemensam Kanban-bräda med Väntande, Pågående och Klart;
- uppgifter med titel, valfri beskrivning, poäng, status och valfri ansvarig;
- skapande, tilldelning, statusändring, drag-and-drop, permanent radering och redigering;
- låsning och felhantering per task-id;
- serverbekräftade uppdateringar för tilldelning, statusknappar, radering och redigering;
- optimistisk drag-and-drop med full rollback.
Aktiv användare är ett lokalt gränssnittsval och inte autentisering eller behörighetskontroll.
Feature 0 – Projektgrund
Status: Färdig och mergad till main.
Resultat
- Monorepo med
backend/,frontend/ochdocs/. - Backend med Java 21, Spring Boot, Maven Wrapper och Spring Web.
- Frontend med React, TypeScript, Vite och pnpm.
- Health-endpoint:
GET /api/health. - Vite-proxy från
/apitill lokal backend på port 8080. - Grundläggande backend- och frontendtester.
- Inledande
README.md,AGENTS.mdoch.gitignore.
Viktiga beslut
- Frontend och backend är separata applikationer i samma repository.
- Frontend använder relativa
/api-adresser. - Ingen generell CORS-konfiguration infördes.
Begränsningar
Ingen databas, domänmodell, autentisering, deployment eller containerkonfiguration infördes.
Relaterade commits
- Feature-commit:
9957383e88b08dc006d2eaeb2a513c7769bd5705
Fullständig historik: docs/features/000-project-foundation.md.
Feature 1 – Användarval
Status: Färdig och mergad till main.
Resultat
- Centralt lagrade användare.
- API:
GET /api/usersochPOST /api/users. - UUID som användar-id.
- Namn trimmas och valideras.
- Skiftlägesokänslig unikhet genom internt normaliserat namn.
- Frontendflöden för användarval, skapande, laddning, fel och utloggning.
- Aktiv användares UUID lagras under
hemhub.activeUserId.
Viktiga beslut
- Backend är slutlig auktoritet för namnvalidering.
- Endast användar-id lagras lokalt.
- Id:t verifieras mot backendens användarlista vid appstart.
- Ogiltigt lagrat id tas bort.
Logga utrensar valet och visar användarvalet igen.- Lösningen är inte autentisering.
Databas
Flyway-migreringen V1__create_users.sql skapade app_user.
Relaterade commits
- Feature-commit:
1ec7a729085d456d3185a1c74d02f99f40de0e8d - Merge-commit:
050f248857a01db2dc236a0ca35982fd70dab3d6
Fullständig historik: docs/features/001-user-selection.md.
Feature 2 – Skapa uppgifter
Status: Färdig och mergad till main.
Resultat
- Persistent uppgiftsmodell.
- API:
GET /api/tasksochPOST /api/tasks. - Kanban-bräda med
WAITING,IN_PROGRESSochCOMPLETED. - Modal för att skapa uppgifter.
- Ursprungliga fält: UUID, titel, valfri beskrivning, status och skapandetid.
- Nya uppgifter får alltid status
WAITING. - Listningen sorteras efter
createdAt ASC, id ASC.
Validering
- Titel är obligatorisk, trimmas och får vara högst 100 Unicode-kodpunkter.
- Beskrivning är valfri, trimmas, får vara högst 500 Unicode-kodpunkter och lagras som
nullnär den är tom.
Frontendbeteende
- Titelfältet får fokus när modalen öppnas.
- Modalen kan före submit stängas med kryss, Escape eller bakgrundsklick.
- Dubbelsubmit blockeras.
- Inmatning behålls vid API-fel.
- Serverresponsen läggs sist i befintlig lista.
Databas
Flyway-migreringen V2__create_tasks.sql skapade task.
Relaterade commits
- Feature-commit:
3f152eecccdd88f840066543bf9321b81b4cead8 - Merge-commit:
2f7b99fb21c57c2e9c5f019a2b5073458e41c939
Fullständig historik: docs/features/002-task-creation.md.
Feature 3 – Uppgiftspoäng
Status: Färdig och mergad till main.
Resultat
- Obligatoriskt fält
pointspå varje uppgift. - Tillåtna värden är heltal 1–99.
- Skapandemodalen använder standardvärdet
1. - Frontend skickar alltid poäng uttryckligen.
- Backend fyller inte automatiskt i saknade poäng.
- Uppgiftskort visar
{points} p.
Databas
- Flyway-migreringen
V3__add_task_points.sql. points INTEGER NOT NULL.- Constraint för intervallet 1–99.
- Inget permanent databasdefaultvärde.
Viktiga beslut
Poäng uttrycker uppgiftens samlade värde utifrån hur tidskrävande, besvärlig eller viktig den är.
Ingen poänghistorik, summering eller utdelning infördes.
Lokal utveckling ändrades till H2 in-memory och utvecklingsdata återställs vid omstart.
Relaterade commits
- Feature-commit:
059d4da9214969ed3e28592178160da6de614b4d - Merge-commit:
2e62261f49bb3142e28882483e41e0250ab11c5f
Fullständig historik: docs/features/003-task-points.md.
Feature 4 – Tilldelning av uppgifter
Status: Färdig och mergad till main.
Resultat
- En uppgift kan vara otilldelad eller ha exakt en ansvarig.
- Valfri ansvarig vid skapande.
- API:
PUT /api/tasks/{taskId}/assignee. - Task-responsen innehåller
assignee: nulleller{id, name}. - Frontend visar och ändrar ansvarig på kortet.
- Serverresponsen ersätter den lokala uppgiften utan omsortering.
Viktiga beslut
- Högst en ansvarig.
- Ingen förvald ansvarig vid skapande.
- Aktiv användare är inte behörighetsgrund.
- Tilldelning ändrar inte status.
Feature 5 utvidgade senare de statusberoende tilldelningsreglerna.
Databas
V4__add_task_assignee.sql lade till nullable assignee_id med främmande nyckel till app_user.
JPA-relationen är lazy ManyToOne, och entity graph används för att hämta ansvarig med uppgiften.
Relaterade commits
- Feature-commit:
aaebe888f3bae43b3413e9fa3893fec90afac8b4 - Merge-commit:
d78611f5f77374228f1f69b66734931a988f8355
Fullständig historik: docs/features/004-task-assignment.md.
Feature 5 – Statusändring och statusregler
Status: Färdig och mergad till main.
Resultat
- API:
PUT /api/tasks/{taskId}/status. - Alla direkta övergångar mellan
WAITING,IN_PROGRESSochCOMPLETED. - Samma målstatus är giltig och idempotent.
- Knappbaserat statusflöde på korten.
- Serverbekräftad uppdatering och låsning per task-id.
Status- och tilldelningsregler
IN_PROGRESSmåste ha ansvarig.WAITINGochCOMPLETEDfår vara otilldelade.- Tilldelnings-API:t får tilldela eller byta ansvarig i alla statusar.
- Ansvarig får tas bort i
WAITINGochCOMPLETED, men inte iIN_PROGRESS. - Tilldelning ändrar aldrig status.
- När en otilldelad uppgift påbörjas skickar frontend aktiv användares id.
- Backend tilldelar användaren och ändrar status i samma transaktion.
- Befintlig ansvarig byts aldrig av statusoperationen.
Centrala felkoder
TASK_NOT_FOUNDINVALID_TASK_STATUSUSER_NOT_FOUNDTASK_REQUIRES_ASSIGNEE
Relaterade commits
- Feature-commit:
65a6488c0b268f49b1361591f025bdea8d67f754
Fullständig historik: docs/features/005-task-status.md.
Feature 6 – Drag-and-drop
Status: Färdig och mergad till main.
Resultat
- Drag-and-drop mellan statuskolumner.
- Återanvänder Feature 5:s status-API.
- Frontend använder
@dnd-kit/reactoch@dnd-kit/dom. - Ingen sortering inom kolumner och ingen persistent kortordning.
- Dragbiblioteket är avgränsat i
TaskDragAndDrop.tsx.
Uppdateringsstrategi
Drag-and-drop är optimistiskt:
- hela tidigare task-versionen sparas;
- kortet flyttas direkt;
- kortet låses och tonas ned;
- statusanropet skickas;
- serverresponsen ersätter det optimistiska värdet;
- vid fel återställs hela tidigare task-versionen.
Rollback omfattar hela uppgiften eftersom flytt till IN_PROGRESS även kan innebära optimistisk tilldelning till aktiv användare.
Statusknapparna förblev serverbekräftade.
Interaktion
- Drop i samma kolumn är no-op.
- Avbruten dragning eller ogiltigt mål är no-op.
- Kortets icke-interaktiva yta är dragyta.
- Knappar och andra interaktiva kontroller startar inte drag.
- Låsning sker per task-id.
- Andra kort förblir interaktiva.
Relaterade commits
- Feature-commit:
c3c64482c062f144fd6cb6036e3c9db0afa5ec1e - Merge-commit:
2696195e741c155a197ae9838d1938bdf2148cc2
Fullständig historik: docs/features/006-task-drag-and-drop.md.
Feature 7 – Radera uppgift
Status: Färdig och mergad till main.
Resultat
- Permanent fysisk radering.
- API:
DELETE /api/tasks/{taskId}. - Lyckad radering ger
204 No Content. - Okänd eller redan raderad uppgift ger
404 TASK_NOT_FOUND. - Uppgifter får raderas i alla statusar.
- Aktiv användare och ansvarig påverkar inte möjligheten att radera.
Frontendflöde
- Diskret inline-SVG-sopkorg i kortets åtgärdsområde.
- Separat bekräftelsemodal.
- Radering är serverbekräftad.
- Kort och modal ligger kvar under anropet.
- Samtliga stängningsvägar blockeras under anropet.
- Kortet tas bort först efter
204. - Vanliga fel behåller kort och dialog.
- Strukturerat
404 TASK_NOT_FOUNDtar bort ett inaktuellt lokalt kort.
Viktiga beslut
- Ingen mjuk radering.
- Ingen papperskorg, återställning, undo eller arkivering.
- Ingen Flyway-migrering behövdes.
- Samma låsning per task-id används för status, tilldelning, drag och radering.
Relaterade commits
- Feature-commit:
f296d15 - Merge-commit:
5df0146
Fullständig historik: docs/features/007-task-deletion.md.
Feature 8 – Redigera uppgift
Status: Färdig och mergad till main.
Resultat
- Redigering av titel, beskrivning och poäng.
- Separat redigeringsmodal.
- Synlig inline-SVG-redigeringsknapp bredvid sopkorgen.
- API:
PUT /api/tasks/{taskId}/details. - Requesten innehåller alltid hela den redigerbara fältuppsättningen.
- Lyckad uppdatering ger
200 OKmed fullständig task-respons.
Avgränsning
Redigeringsflödet ändrar inte id, status, ansvarig eller skapandetid.
Status och ansvarig hanteras fortsatt genom sina specialiserade API:er.
Frontendflöde
- Aktuella värden fylls i när modalen öppnas.
null-beskrivning visas som tom sträng.- Titelfältet får initialt fokus.
- Osparade ändringar kastas utan extra bekräftelse.
- Redigeringen är serverbekräftad.
- Gamla kortvärden ligger kvar under anropet.
- Modalen och kortet låses under save.
- Serverresponsen ersätter uppgiften på befintlig plats.
- Kolumn och ordning behålls.
- Vanliga fel behåller modal och inmatning.
- Strukturerat
404 TASK_NOT_FOUNDtar bort ett inaktuellt lokalt kort.
Backendregler
- Samma validering som vid skapande.
- Samma värden accepteras idempotent.
- Redigering tillåts i alla statusar.
- Ingen
updatedAt. - Ingen Flyway-migrering behövdes.
Verifierad begränsning
H2:s VARCHAR räknar UTF-16-kodenheter för vissa tecken utanför BMP. Applikationen validerar enligt Unicode-kodpunkter, men H2 kan därför avvisa vissa gränsfall med astrala tecken. Detta ska verifieras mot PostgreSQL när produktionsdatabasen införs.
Relaterade commits
- Feature-commit:
443f686 - Merge-commit:
28258f4
Fullständig historik: docs/features/008-task-editing.md.
Tvärgående beslut efter Feature 8
API och backend
- Backend är slutlig garant för affärsregler och validering.
- Task-operationer är avgränsade till skapande, detaljredigering, tilldelning, statusändring och radering.
- Serverns fullständiga task-respons är slutlig sanning.
- Kända fel använder gemensamt format med
codeochmessage.
Frontend-state
- React-komponenter hanterar lokalt state.
- Ingen router eller separat global state-lösning används.
- Operationer låses per task-id.
- Andra kort förblir interaktiva när ett kort har ett pågående anrop.
- Statusknappar, tilldelning, radering och redigering är serverbekräftade.
- Drag-and-drop är optimistiskt med full rollback.
Databas
Aktuella Flyway-migreringar:
V1__create_users.sql
V2__create_tasks.sql
V3__add_task_points.sql
V4__add_task_assignee.sql
Lokal utveckling och automatiska tester använder H2 in-memory i PostgreSQL-kompatibilitetsläge.
PostgreSQL är planerad produktionsdatabas men ännu inte implementerad eller verifierad.
Deployment
Planerad men ännu inte implementerad riktning:
- PostgreSQL;
- separata Docker-images för frontend och backend;
- Drone för bygge och publicering;
- privat registry;
- Watchtower för uppdatering;
- Nginx som möjlig reverse proxy;
- drift på Ubuntu-servern Biff.
Utvecklingsprocess
- En kortlivad branch per feature.
- Branch skapas från uppdaterad
main. - Kod, tester och relevant dokumentation uppdateras tillsammans.
- Commit och push sker först efter uttrycklig instruktion.
- Merge sker efter automatisk och relevant manuell verifiering.
- Dokumentationen ska räcka för att förstå projektet utan tidigare dialoger eller raderade branches.
Nästa feature
Feature 9 – Deadline
Roadmapens nuvarande mål:
- valfri deadline;
- beslutad representation av datum och eventuell tid;
- visning på uppgiftskort;
- markering av försenade uppgifter.
Öppna frågor:
- datum utan tid eller datum och tid;
- tidszonshantering;
- definition av försenad uppgift.