Unified Account and Workspace drop-downs; Layout updates, now header lives within the PageBody component; Sidebars now use floating variant
73 lines
1.9 KiB
TypeScript
73 lines
1.9 KiB
TypeScript
'use server';
|
|
|
|
import { redirect } from 'next/navigation';
|
|
|
|
import { authActionClient } from '@kit/next/safe-action';
|
|
import { getLogger } from '@kit/shared/logger';
|
|
|
|
import { CreateTeamSchema } from '../../schema/create-team.schema';
|
|
import { createAccountCreationPolicyEvaluator } from '../policies';
|
|
import { createCreateTeamAccountService } from '../services/create-team-account.service';
|
|
|
|
export const createTeamAccountAction = authActionClient
|
|
.schema(CreateTeamSchema)
|
|
.action(async ({ parsedInput: { name, slug }, ctx: { user } }) => {
|
|
const logger = await getLogger();
|
|
const service = createCreateTeamAccountService();
|
|
|
|
const ctx = {
|
|
name: 'team-accounts.create',
|
|
userId: user.id,
|
|
accountName: name,
|
|
};
|
|
|
|
logger.info(ctx, `Creating team account...`);
|
|
|
|
// Check policies before creating
|
|
const evaluator = createAccountCreationPolicyEvaluator();
|
|
|
|
if (await evaluator.hasPoliciesForStage('submission')) {
|
|
const policyContext = {
|
|
timestamp: new Date().toISOString(),
|
|
userId: user.id,
|
|
accountName: name,
|
|
};
|
|
|
|
const result = await evaluator.canCreateAccount(
|
|
policyContext,
|
|
'submission',
|
|
);
|
|
|
|
if (!result.allowed) {
|
|
logger.warn(
|
|
{ ...ctx, reasons: result.reasons },
|
|
`Policy denied team account creation`,
|
|
);
|
|
|
|
return {
|
|
error: true,
|
|
message: result.reasons[0] ?? 'Policy denied account creation',
|
|
};
|
|
}
|
|
}
|
|
|
|
const { data, error } = await service.createNewOrganizationAccount({
|
|
name,
|
|
userId: user.id,
|
|
slug,
|
|
});
|
|
|
|
if (error === 'duplicate_slug') {
|
|
return {
|
|
error: true,
|
|
message: 'teams.duplicateSlugError',
|
|
};
|
|
}
|
|
|
|
logger.info(ctx, `Team account created`);
|
|
|
|
const accountHomePath = '/home/' + data.slug;
|
|
|
|
redirect(accountHomePath);
|
|
});
|