feat(contacts): add complete contacts app with backend, web, and landing

- Add NestJS backend with CRUD endpoints for contacts, groups, tags, notes, and activities
- Add SvelteKit web app with auth pages (login, register, forgot-password)
- Add Astro landing page
- Add ContactsLogo to shared-branding package
- Add contacts to MANA_APPS configuration
- Update shared-storage with contacts bucket support
- Update environment scripts and Docker configuration for contacts database
- Integrate mana-core-auth for JWT authentication
- Follow existing app architecture patterns (route groups, PillNavigation)

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Till-JS 2025-12-02 13:17:42 +01:00
parent 00176a25e0
commit 45d70150f4
76 changed files with 3812 additions and 1 deletions

View file

@ -29,6 +29,7 @@ The following buckets are automatically created:
| `presi-storage` | Presi | Presentation slides |
| `calendar-storage` | Calendar | Calendar attachments |
| `contacts-storage` | Contacts | Contact avatars/files |
| `storage-storage` | Storage | Cloud drive files |
## Usage
@ -89,6 +90,7 @@ import {
createPresiStorage,
createCalendarStorage,
createContactsStorage,
createStorageStorage,
} from '@manacore/shared-storage';
```

View file

@ -119,3 +119,13 @@ export function createCalendarStorage(): StorageClient {
export function createContactsStorage(): StorageClient {
return createStorageClient({ name: BUCKETS.CONTACTS });
}
/**
* Create a storage client for the Storage project (cloud drive)
*/
export function createStorageStorage(publicUrl?: string): StorageClient {
return createStorageClient({
name: BUCKETS.STORAGE,
publicUrl: publicUrl ?? process.env.STORAGE_S3_PUBLIC_URL,
});
}

View file

@ -12,6 +12,7 @@ export {
createPresiStorage,
createCalendarStorage,
createContactsStorage,
createStorageStorage,
} from './factory.js';
// Utilities

View file

@ -83,6 +83,7 @@ export const BUCKETS = {
PRESI: 'presi-storage',
CALENDAR: 'calendar-storage',
CONTACTS: 'contacts-storage',
STORAGE: 'storage-storage',
} as const;
export type BucketName = (typeof BUCKETS)[keyof typeof BUCKETS];