Initial commit: Port Nimara CRM (Layers 0-4)
Some checks failed
Build & Push Docker Images / build-and-push (push) Has been cancelled
Build & Push Docker Images / deploy (push) Has been cancelled
Build & Push Docker Images / lint (push) Has been cancelled

Full CRM rebuild with Next.js 15, TypeScript, Tailwind, Drizzle ORM,
PostgreSQL, Redis, BullMQ, MinIO, and Socket.io. Includes 461 source
files covering clients, berths, interests/pipeline, documents/EOI,
expenses/invoices, email, notifications, dashboard, admin, and
client portal. CI/CD via Gitea Actions with Docker builds.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
2026-03-26 11:52:51 +01:00
commit 67d7e6e3d5
572 changed files with 86496 additions and 0 deletions

56
src/types/auth.ts Normal file
View File

@@ -0,0 +1,56 @@
import type { RolePermissions, UserPreferences } from '@/lib/db/schema/users';
import type { Port } from '@/lib/db/schema/ports';
/** Typed Better Auth user object */
export interface AuthUser {
id: string;
email: string;
name: string;
image: string | null;
emailVerified: boolean;
createdAt: Date;
updatedAt: Date;
}
/** Typed Better Auth session object */
export interface AuthSession {
id: string;
userId: string;
token: string;
expiresAt: Date;
ipAddress: string | null;
userAgent: string | null;
createdAt: Date;
updatedAt: Date;
user: AuthUser | null;
}
/** Extended user profile (from user_profiles table) */
export interface UserProfile {
id: string;
userId: string;
displayName: string;
avatarUrl: string | null;
phone: string | null;
isSuperAdmin: boolean;
isActive: boolean;
lastLoginAt: Date | null;
preferences: UserPreferences;
createdAt: Date;
updatedAt: Date;
}
/** Port context as seen by the authenticated user */
export interface PortContext {
port: Port;
roleId: string;
roleName: string;
permissions: RolePermissions;
}
/** Full authenticated user context (session + profile + port roles) */
export interface AuthenticatedUser extends AuthUser {
profile: UserProfile | null;
portContexts: PortContext[];
currentPortContext: PortContext | null;
}