Add account hierarchy framework with migrations, RLS policies, and UI components

This commit is contained in:
T. Zehetbauer
2026-03-31 22:18:04 +02:00
parent 7e7da0b465
commit 59546ad6d2
262 changed files with 11671 additions and 3927 deletions

View File

@@ -1,7 +1,9 @@
'use server';
import { z } from 'zod';
import { revalidatePath } from 'next/cache';
import { z } from 'zod';
import { authActionClient } from '@kit/next/safe-action';
import { getLogger } from '@kit/shared/logger';
import { getSupabaseServerClient } from '@kit/supabase/server-client';
@@ -14,7 +16,6 @@ import {
UpdateItemStatusSchema,
ReorderItemsSchema,
} from '../../schema/meetings.schema';
import { createMeetingsApi } from '../api';
const REVALIDATION_PATH = '/home/[account]/meetings';
@@ -31,7 +32,10 @@ export const createProtocol = authActionClient
const api = createMeetingsApi(client);
const userId = ctx.user.id;
logger.info({ name: 'meetings.protocol.create' }, 'Protokoll wird erstellt...');
logger.info(
{ name: 'meetings.protocol.create' },
'Protokoll wird erstellt...',
);
const result = await api.createProtocol(input, userId);
logger.info({ name: 'meetings.protocol.create' }, 'Protokoll erstellt');
revalidatePath(REVALIDATION_PATH, 'page');
@@ -46,7 +50,10 @@ export const updateProtocol = authActionClient
const api = createMeetingsApi(client);
const userId = ctx.user.id;
logger.info({ name: 'meetings.protocol.update' }, 'Protokoll wird aktualisiert...');
logger.info(
{ name: 'meetings.protocol.update' },
'Protokoll wird aktualisiert...',
);
const result = await api.updateProtocol(input, userId);
logger.info({ name: 'meetings.protocol.update' }, 'Protokoll aktualisiert');
revalidatePath(REVALIDATION_PATH, 'page');
@@ -65,7 +72,10 @@ export const deleteProtocol = authActionClient
const logger = await getLogger();
const api = createMeetingsApi(client);
logger.info({ name: 'meetings.protocol.delete' }, 'Protokoll wird gelöscht...');
logger.info(
{ name: 'meetings.protocol.delete' },
'Protokoll wird gelöscht...',
);
await api.deleteProtocol(input.protocolId);
logger.info({ name: 'meetings.protocol.delete' }, 'Protokoll gelöscht');
revalidatePath(REVALIDATION_PATH, 'page');
@@ -84,9 +94,15 @@ export const createProtocolItem = authActionClient
const api = createMeetingsApi(client);
const userId = ctx.user.id;
logger.info({ name: 'meetings.item.create' }, 'Tagesordnungspunkt wird erstellt...');
logger.info(
{ name: 'meetings.item.create' },
'Tagesordnungspunkt wird erstellt...',
);
const result = await api.createItem(input, userId);
logger.info({ name: 'meetings.item.create' }, 'Tagesordnungspunkt erstellt');
logger.info(
{ name: 'meetings.item.create' },
'Tagesordnungspunkt erstellt',
);
revalidatePath(REVALIDATION_PATH, 'page');
return { success: true, data: result };
});
@@ -99,9 +115,15 @@ export const updateProtocolItem = authActionClient
const api = createMeetingsApi(client);
const userId = ctx.user.id;
logger.info({ name: 'meetings.item.update' }, 'Tagesordnungspunkt wird aktualisiert...');
logger.info(
{ name: 'meetings.item.update' },
'Tagesordnungspunkt wird aktualisiert...',
);
const result = await api.updateItem(input, userId);
logger.info({ name: 'meetings.item.update' }, 'Tagesordnungspunkt aktualisiert');
logger.info(
{ name: 'meetings.item.update' },
'Tagesordnungspunkt aktualisiert',
);
revalidatePath(REVALIDATION_PATH, 'page');
return { success: true, data: result };
});
@@ -132,9 +154,15 @@ export const deleteProtocolItem = authActionClient
const logger = await getLogger();
const api = createMeetingsApi(client);
logger.info({ name: 'meetings.item.delete' }, 'Tagesordnungspunkt wird gelöscht...');
logger.info(
{ name: 'meetings.item.delete' },
'Tagesordnungspunkt wird gelöscht...',
);
await api.deleteItem(input.itemId);
logger.info({ name: 'meetings.item.delete' }, 'Tagesordnungspunkt gelöscht');
logger.info(
{ name: 'meetings.item.delete' },
'Tagesordnungspunkt gelöscht',
);
revalidatePath(REVALIDATION_PATH, 'page');
return { success: true };
});
@@ -146,7 +174,10 @@ export const reorderProtocolItems = authActionClient
const logger = await getLogger();
const api = createMeetingsApi(client);
logger.info({ name: 'meetings.items.reorder' }, 'Reihenfolge wird aktualisiert...');
logger.info(
{ name: 'meetings.items.reorder' },
'Reihenfolge wird aktualisiert...',
);
await api.reorderItems(input);
logger.info({ name: 'meetings.items.reorder' }, 'Reihenfolge aktualisiert');
revalidatePath(REVALIDATION_PATH, 'page');
@@ -173,7 +204,10 @@ export const addProtocolAttachment = authActionClient
const api = createMeetingsApi(client);
const userId = ctx.user.id;
logger.info({ name: 'meetings.attachment.add' }, 'Anhang wird hinzugefügt...');
logger.info(
{ name: 'meetings.attachment.add' },
'Anhang wird hinzugefügt...',
);
const result = await api.addAttachment(
input.protocolId,
input.fileName,
@@ -198,7 +232,10 @@ export const deleteProtocolAttachment = authActionClient
const logger = await getLogger();
const api = createMeetingsApi(client);
logger.info({ name: 'meetings.attachment.delete' }, 'Anhang wird gelöscht...');
logger.info(
{ name: 'meetings.attachment.delete' },
'Anhang wird gelöscht...',
);
await api.deleteAttachment(input.attachmentId);
logger.info({ name: 'meetings.attachment.delete' }, 'Anhang gelöscht');
revalidatePath(REVALIDATION_PATH, 'page');