145 lines
6.3 KiB
JavaScript
145 lines
6.3 KiB
JavaScript
"use strict";
|
|
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
}
|
|
Object.defineProperty(o, k2, desc);
|
|
}) : (function(o, m, k, k2) {
|
|
if (k2 === undefined) k2 = k;
|
|
o[k2] = m[k];
|
|
}));
|
|
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
}) : function(o, v) {
|
|
o["default"] = v;
|
|
});
|
|
var __importStar = (this && this.__importStar) || (function () {
|
|
var ownKeys = function(o) {
|
|
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
var ar = [];
|
|
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
return ar;
|
|
};
|
|
return ownKeys(o);
|
|
};
|
|
return function (mod) {
|
|
if (mod && mod.__esModule) return mod;
|
|
var result = {};
|
|
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
__setModuleDefault(result, mod);
|
|
return result;
|
|
};
|
|
})();
|
|
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
};
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.signup = signup;
|
|
exports.completeSignupDisabled = completeSignupDisabled;
|
|
exports.verifyEmailDisabled = verifyEmailDisabled;
|
|
const bcryptjs_1 = __importDefault(require("bcryptjs"));
|
|
const errors_1 = require("../../http/errors");
|
|
const prisma_1 = require("../../lib/prisma");
|
|
const notificationService_1 = require("../../services/notificationService");
|
|
const notificationLocalizationService_1 = require("../../services/notificationLocalizationService");
|
|
const auth_presenter_1 = require("./auth.presenter");
|
|
const repo = __importStar(require("./auth.company.repo"));
|
|
const TRIAL_PERIOD_DAYS = 90;
|
|
function slugify(value) {
|
|
return value.toLowerCase().replace(/[^a-z0-9]+/g, '-').replace(/^-+|-+$/g, '').slice(0, 50) || 'company';
|
|
}
|
|
async function generateUniqueSlug(baseName) {
|
|
const base = slugify(baseName);
|
|
for (let attempt = 0; attempt < 25; attempt++) {
|
|
const slug = attempt === 0 ? base : `${base}-${attempt + 1}`;
|
|
const existing = await repo.findCompanyBySlug(slug);
|
|
if (!existing)
|
|
return slug;
|
|
}
|
|
return `${base}-${Date.now().toString(36)}`;
|
|
}
|
|
async function signup(body) {
|
|
if (await repo.findCompanyByEmail(body.companyEmail)) {
|
|
throw new errors_1.AppError('A company account with this contact email already exists', 409, 'company_email_taken');
|
|
}
|
|
if (await repo.findEmployeeByEmail(body.email)) {
|
|
throw new errors_1.AppError('An employee account with this owner email already exists', 409, 'owner_email_taken');
|
|
}
|
|
const slug = await generateUniqueSlug(body.companyName);
|
|
const now = new Date();
|
|
const trialEndAt = new Date(now.getTime() + TRIAL_PERIOD_DAYS * 24 * 60 * 60 * 1000);
|
|
const passwordHash = await bcryptjs_1.default.hash(body.password, 12);
|
|
const result = await prisma_1.prisma.$transaction((tx) => repo.createCompanySignup(tx, {
|
|
companyName: body.companyName,
|
|
legalName: body.legalName,
|
|
slug,
|
|
ownerEmail: body.email,
|
|
companyEmail: body.companyEmail,
|
|
companyPhone: body.companyPhone,
|
|
streetAddress: body.streetAddress,
|
|
city: body.city,
|
|
country: body.country,
|
|
zipCode: body.zipCode,
|
|
legalForm: body.legalForm,
|
|
managerName: `${body.firstName} ${body.lastName}`.trim(),
|
|
iceNumber: body.iceNumber,
|
|
taxId: body.taxId,
|
|
operatingLicenseNumber: body.operatingLicenseNumber,
|
|
operatingLicenseIssuedAt: body.operatingLicenseIssuedAt,
|
|
operatingLicenseIssuedBy: body.operatingLicenseIssuedBy,
|
|
fax: body.fax,
|
|
yearsActive: body.yearsActive,
|
|
representativeName: body.representativeName,
|
|
representativeTitle: body.representativeTitle,
|
|
responsibleName: body.responsibleName,
|
|
responsibleRole: body.responsibleRole,
|
|
responsibleIdentityNumber: body.responsibleIdentityNumber,
|
|
responsibleQualification: body.responsibleQualification,
|
|
responsiblePhone: body.responsiblePhone,
|
|
responsibleEmail: body.responsibleEmail,
|
|
currency: body.currency,
|
|
registrationNumber: body.registrationNumber,
|
|
plan: body.plan,
|
|
billingPeriod: body.billingPeriod,
|
|
preferredLanguage: body.preferredLanguage,
|
|
firstName: body.firstName,
|
|
lastName: body.lastName,
|
|
passwordHash,
|
|
now,
|
|
trialEndAt,
|
|
}));
|
|
const lang = (0, notificationLocalizationService_1.coerceNotificationLocale)(body.preferredLanguage);
|
|
const emailResult = await (0, notificationService_1.sendNotification)({
|
|
type: 'ACCOUNT_CREATED',
|
|
companyId: result.company.id,
|
|
employeeId: result.employee.id,
|
|
email: body.email,
|
|
channels: ['EMAIL', 'IN_APP'],
|
|
locale: lang,
|
|
templateKey: 'account.created',
|
|
templateVariables: {
|
|
firstName: body.firstName,
|
|
companyName: body.companyName,
|
|
planName: (0, notificationLocalizationService_1.localizePlanName)(body.plan, lang),
|
|
billingPeriodLabel: (0, notificationLocalizationService_1.localizeBillingPeriod)(body.billingPeriod, lang),
|
|
currency: body.currency,
|
|
paymentProvider: body.paymentProvider,
|
|
trialEndDate: trialEndAt,
|
|
},
|
|
}).catch(() => []);
|
|
const emailDelivery = emailResult.find((entry) => entry.channel === 'EMAIL');
|
|
return (0, auth_presenter_1.presentCompanySignup)({
|
|
company: result.company,
|
|
trialEndAt,
|
|
emailDelivery,
|
|
});
|
|
}
|
|
function completeSignupDisabled() {
|
|
throw new errors_1.AppError('Clerk-based signup has been removed. Use /auth/company/signup instead.', 410, 'disabled');
|
|
}
|
|
function verifyEmailDisabled() {
|
|
throw new errors_1.AppError('Email verification resend via Clerk has been removed from this project.', 410, 'disabled');
|
|
}
|
|
//# sourceMappingURL=auth.company.service.js.map
|