mirror of
https://github.com/Memo-2023/mana-monorepo.git
synced 2026-05-14 22:21:10 +02:00
Move inactive projects out of active workspace: - bauntown (community website) - maerchenzauber (AI story generation) - memoro (voice memo app) - news (news aggregation) - nutriphi (nutrition tracking) - reader (reading app) - uload (URL shortener) - wisekeep (AI wisdom extraction) Update CLAUDE.md documentation: - Add presi to active projects - Document archived projects section - Update workspace configuration Archived apps can be re-activated by moving back to apps/ 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
7.3 KiB
7.3 KiB
Projects & Shared Usernames Feature
Implementiert am: 16. Januar 2025
Version: 1.0.0
Status: ✅ Vollständig implementiert
Übersicht
Das Projects-System ermöglicht es Teams und Organisationen, gemeinsame Link-Sammlungen unter einem einheitlichen Username zu verwalten. Mehrere Nutzer können Links unter demselben Projekt-Username erstellen und verwalten, wodurch eine konsistente Markenpräsenz gewährleistet wird.
Use Case
Beispiel: Firma Memoro
- Erstellt Projekt mit Username
@memoro - Mehrere Teammitglieder können Links erstellen
- Alle Links sind unter
ulo.ad/u/memoro/...erreichbar - Zentrale Verwaltung und einheitliches Branding
Technische Implementierung
Datenbank-Schema
1. projects Collection
{
id: string (auto),
name: string, // z.B. "Memoro GmbH"
username: string, // z.B. "memoro" (unique)
description: string?, // Projektbeschreibung
logo: file?, // Projekt-Logo
owner_id: relation, // Verweis auf users
settings: json, // Projekt-Einstellungen
is_active: boolean, // Projekt aktiv/inaktiv
created: date,
updated: date
}
Berechtigungen:
listRule/viewRule: Authentifizierte User (Owner oder Mitglieder)createRule: Jeder authentifizierte UserupdateRule: Nur OwnerdeleteRule: Nur Owner
2. project_members Collection
{
id: string (auto),
project_id: relation, // Verweis auf projects
user_id: relation, // Verweis auf users
role: select, // "admin" | "editor" | "viewer"
can_create_links: boolean,
can_edit_links: boolean,
can_delete_links: boolean,
joined_at: date,
created: date,
updated: date
}
Rollen-Berechtigungen:
- Admin: Volle Verwaltung (Links + Mitglieder)
- Editor: Links erstellen und bearbeiten
- Viewer: Nur Ansicht
3. links Collection (erweitert)
{
// Bestehende Felder...
project_id: relation?, // NEU: Verweis auf projects
created_by: relation?, // NEU: Wer hat den Link erstellt
user_id: relation? // Jetzt optional (entweder user_id ODER project_id)
}
Regel-Updates:
- Links können entweder einem User ODER einem Projekt gehören
created_bytrackt immer den Ersteller (wichtig bei Projekt-Links)
API-Endpunkte & Routes
Projekt-Verwaltung
GET /projects- Liste aller Projekte des UsersGET /projects/[id]- Projekt-Details mit Mitgliedern und LinksPOST /projects- Neues Projekt erstellenGET /projects/[id]/settings- Projekt-Einstellungen (geplant)
Link-Routing
/u/[username]/[code]- Funktioniert für User UND Projekt-Usernames- Prüft zuerst
users.username - Falls nicht gefunden, prüft
projects.username - Leitet zur Original-URL weiter
- Prüft zuerst
Actions
create- Projekt erstellen mit Username-ValidierungaddMember- Mitglied per E-Mail hinzufügenremoveMember- Mitglied entfernenupdateMember- Rolle/Berechtigungen ändern
UI-Komponenten
1. Projects Übersicht (/projects)
- Grid-Ansicht aller Projekte
- Unterscheidung: "Your Projects" vs "Member Projects"
- Quick-Create Form mit Username-Validierung
- Visual: Karten mit Name, @username, Beschreibung
2. Projekt-Detail (/projects/[id])
- Header: Name, Username, URL-Copy-Button
- Stats: Links-Anzahl, Mitglieder, Total Clicks
- Members Panel:
- Owner mit Badge
- Mitglieder-Liste mit Rollen
- Add/Remove Funktionen für Owner
- Links Panel:
- Alle Projekt-Links
- Creator-Attribution
- Click-Statistiken
3. Link-Erstellung (erweitert)
- Projekt-Auswahl beim Erstellen
- URL-Parameter:
?project=PROJECT_ID - Automatische URL-Generierung mit Projekt-Username
Sicherheit & Berechtigungen
Zugriffskontrolle
-- Projekt-Links anzeigen
@request.auth.id = created_by
|| project_id.owner_id = @request.auth.id
|| @collection.project_members.user_id ?= @request.auth.id
-- Links bearbeiten
created_by = @request.auth.id
|| (project_id && @collection.project_members.user_id = @request.auth.id
&& @collection.project_members.can_edit_links = true)
Username-Validierung
- Nutzt bestehende
validateUsername()Funktion - Prüft Eindeutigkeit über beide Collections (users + projects)
- Reservierte Usernames werden blockiert
Migration & Backward Compatibility
Bestehende Links
- Alle bestehenden Links bleiben unverändert (user_id gesetzt, project_id = null)
- Keine Breaking Changes für existierende URLs
Neue Links
- Entweder
user_idODERproject_idgesetzt created_bywird immer gesetzt für Audit-Trail
Performance-Überlegungen
Optimierungen
- Username-Lookup: Sequentiell (users → projects) für minimale Latenz
- Caching: Project-Metadaten können gecacht werden (nicht implementiert)
- Indexes: Username-Felder sollten indiziert sein (PocketBase Default)
Skalierung
- Unbegrenzte Projekte pro User
- Unbegrenzte Mitglieder pro Projekt
- Links-Limit nur durch Account-Plan begrenzt
Zukünftige Erweiterungen
Phase 2 (geplant)
- Projekt-Settings Page
- Logo-Upload und Anzeige
- Projekt-spezifische Themes
- Öffentliche Projekt-Profile
- Projekt-Analytics Dashboard
Phase 3 (Ideen)
- Projekt-Templates
- Bulk-Import für Links
- API-Keys pro Projekt
- Webhook-Integration
- Audit-Log für alle Projekt-Aktionen
Testing-Anleitung
Manuelles Testing
-
Projekt erstellen
- Gehe zu /projects - "New Project" → Name: "Test Firma", Username: "testfirma" - Prüfe: Projekt erscheint in "Your Projects" -
Mitglieder verwalten
- Projekt öffnen - "Add Member" → E-Mail eingeben, Rolle wählen - Prüfe: Mitglied erscheint in Liste - Als Mitglied einloggen → Projekt in "Member Projects" -
Links erstellen
- In Projekt: "New Link" klicken - URL eingeben, speichern - Prüfe: Link unter /u/testfirma/[code] erreichbar
Automatisierte Tests (TODO)
// Beispiel-Test
describe('Projects', () => {
it('should create project with unique username', async () => {
// Test implementation
});
it('should prevent duplicate project usernames', async () => {
// Test implementation
});
it('should route project links correctly', async () => {
// Test implementation
});
});
Bekannte Limitierungen
- Username-Konflikte: User und Projekt können nicht denselben Username haben
- Keine Username-Änderung: Einmal gesetzt, kann der Username nicht geändert werden
- Keine Projekt-Übertragung: Owner kann nicht gewechselt werden (nur via DB)
- Keine Massen-Operationen: Links müssen einzeln verschoben werden
Support & Dokumentation
Für Entwickler
- Code:
/src/routes/(app)/projects/ - Collections:
projects,project_members - Utils: Erweiterte
username.tsValidierung
Für Nutzer
- Feature-Announcement: [TODO]
- Help-Center Artikel: [TODO]
- Video-Tutorial: [TODO]
Changelog
v1.0.0 (16.01.2025)
- ✅ Initial Release
- ✅ Projects & project_members Collections
- ✅ UI für Projekt-Verwaltung
- ✅ Link-Zuordnung zu Projekten
- ✅ URL-Routing für Projekt-Usernames
- ✅ Rollenbasierte Berechtigungen
Entwickelt von: Claude mit Tillschneider
Review-Status: In Produktion
Letztes Update: 16.01.2025