mirror of
https://github.com/awatertrevi/infisical.git
synced 2026-10-12 07:29:35 +00:00
PKI revamp: UI improvements
This commit is contained in:
Vendored
+14
-14
@@ -17,9 +17,9 @@ import {
|
||||
TAccessApprovalRequestsReviewersInsert,
|
||||
TAccessApprovalRequestsReviewersUpdate,
|
||||
TAccessApprovalRequestsUpdate,
|
||||
TApiEnrollmentConfigs,
|
||||
TApiEnrollmentConfigsInsert,
|
||||
TApiEnrollmentConfigsUpdate,
|
||||
TPkiApiEnrollmentConfigs,
|
||||
TPkiApiEnrollmentConfigsInsert,
|
||||
TPkiApiEnrollmentConfigsUpdate,
|
||||
TApiKeys,
|
||||
TApiKeysInsert,
|
||||
TApiKeysUpdate,
|
||||
@@ -80,9 +80,9 @@ import {
|
||||
TDynamicSecrets,
|
||||
TDynamicSecretsInsert,
|
||||
TDynamicSecretsUpdate,
|
||||
TEstEnrollmentConfigs,
|
||||
TEstEnrollmentConfigsInsert,
|
||||
TEstEnrollmentConfigsUpdate,
|
||||
TPkiEstEnrollmentConfigs,
|
||||
TPkiEstEnrollmentConfigsInsert,
|
||||
TPkiEstEnrollmentConfigsUpdate,
|
||||
TExternalCertificateAuthorities,
|
||||
TExternalCertificateAuthoritiesInsert,
|
||||
TExternalCertificateAuthoritiesUpdate,
|
||||
@@ -678,15 +678,15 @@ declare module "knex/types/tables" {
|
||||
TCertificateProfilesInsert,
|
||||
TCertificateProfilesUpdate
|
||||
>;
|
||||
[TableName.EstEnrollmentConfig]: KnexOriginal.CompositeTableType<
|
||||
TEstEnrollmentConfigs,
|
||||
TEstEnrollmentConfigsInsert,
|
||||
TEstEnrollmentConfigsUpdate
|
||||
[TableName.PkiEstEnrollmentConfig]: KnexOriginal.CompositeTableType<
|
||||
TPkiEstEnrollmentConfigs,
|
||||
TPkiEstEnrollmentConfigsInsert,
|
||||
TPkiEstEnrollmentConfigsUpdate
|
||||
>;
|
||||
[TableName.ApiEnrollmentConfig]: KnexOriginal.CompositeTableType<
|
||||
TApiEnrollmentConfigs,
|
||||
TApiEnrollmentConfigsInsert,
|
||||
TApiEnrollmentConfigsUpdate
|
||||
[TableName.PkiApiEnrollmentConfig]: KnexOriginal.CompositeTableType<
|
||||
TPkiApiEnrollmentConfigs,
|
||||
TPkiApiEnrollmentConfigsInsert,
|
||||
TPkiApiEnrollmentConfigsUpdate
|
||||
>;
|
||||
[TableName.CertificateTemplateEstConfig]: KnexOriginal.CompositeTableType<
|
||||
TCertificateTemplateEstConfigs,
|
||||
|
||||
@@ -10,7 +10,7 @@ export async function up(knex: Knex): Promise<void> {
|
||||
t.string("projectId").notNullable();
|
||||
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||
|
||||
t.string("name", 64).notNullable();
|
||||
t.string("slug").notNullable();
|
||||
t.string("description");
|
||||
|
||||
t.jsonb("attributes");
|
||||
@@ -22,13 +22,15 @@ export async function up(knex: Knex): Promise<void> {
|
||||
t.jsonb("keyAlgorithm");
|
||||
|
||||
t.timestamps(true, true, true);
|
||||
|
||||
t.unique(["slug", "projectId"]);
|
||||
});
|
||||
|
||||
await createOnUpdateTrigger(knex, TableName.CertificateTemplateV2);
|
||||
}
|
||||
|
||||
if (!(await knex.schema.hasTable(TableName.EstEnrollmentConfig))) {
|
||||
await knex.schema.createTable(TableName.EstEnrollmentConfig, (t) => {
|
||||
if (!(await knex.schema.hasTable(TableName.PkiEstEnrollmentConfig))) {
|
||||
await knex.schema.createTable(TableName.PkiEstEnrollmentConfig, (t) => {
|
||||
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||
|
||||
t.boolean("disableBootstrapCaValidation").defaultTo(false);
|
||||
@@ -38,11 +40,11 @@ export async function up(knex: Knex): Promise<void> {
|
||||
t.timestamps(true, true, true);
|
||||
});
|
||||
|
||||
await createOnUpdateTrigger(knex, TableName.EstEnrollmentConfig);
|
||||
await createOnUpdateTrigger(knex, TableName.PkiEstEnrollmentConfig);
|
||||
}
|
||||
|
||||
if (!(await knex.schema.hasTable(TableName.ApiEnrollmentConfig))) {
|
||||
await knex.schema.createTable(TableName.ApiEnrollmentConfig, (t) => {
|
||||
if (!(await knex.schema.hasTable(TableName.PkiApiEnrollmentConfig))) {
|
||||
await knex.schema.createTable(TableName.PkiApiEnrollmentConfig, (t) => {
|
||||
t.uuid("id", { primaryKey: true }).defaultTo(knex.fn.uuid());
|
||||
|
||||
t.boolean("autoRenew").defaultTo(false);
|
||||
@@ -51,7 +53,7 @@ export async function up(knex: Knex): Promise<void> {
|
||||
t.timestamps(true, true, true);
|
||||
});
|
||||
|
||||
await createOnUpdateTrigger(knex, TableName.ApiEnrollmentConfig);
|
||||
await createOnUpdateTrigger(knex, TableName.PkiApiEnrollmentConfig);
|
||||
}
|
||||
|
||||
if (!(await knex.schema.hasTable(TableName.CertificateProfile))) {
|
||||
@@ -61,25 +63,24 @@ export async function up(knex: Knex): Promise<void> {
|
||||
t.foreign("projectId").references("id").inTable(TableName.Project).onDelete("CASCADE");
|
||||
|
||||
t.uuid("caId").notNullable();
|
||||
t.foreign("caId").references("id").inTable(TableName.CertificateAuthority).onDelete("CASCADE");
|
||||
t.foreign("caId").references("id").inTable(TableName.CertificateAuthority);
|
||||
|
||||
t.uuid("certificateTemplateId").notNullable();
|
||||
t.foreign("certificateTemplateId").references("id").inTable(TableName.CertificateTemplateV2).onDelete("CASCADE");
|
||||
t.foreign("certificateTemplateId").references("id").inTable(TableName.CertificateTemplateV2);
|
||||
|
||||
t.string("name", 64).notNullable();
|
||||
t.string("slug").notNullable();
|
||||
t.string("description");
|
||||
t.string("enrollmentType").notNullable().checkIn(["api", "est"]);
|
||||
|
||||
t.uuid("estConfigId");
|
||||
t.foreign("estConfigId").references("id").inTable(TableName.EstEnrollmentConfig).onDelete("SET NULL");
|
||||
t.foreign("estConfigId").references("id").inTable(TableName.PkiEstEnrollmentConfig).onDelete("SET NULL");
|
||||
|
||||
t.uuid("apiConfigId");
|
||||
t.foreign("apiConfigId").references("id").inTable(TableName.ApiEnrollmentConfig).onDelete("SET NULL");
|
||||
t.foreign("apiConfigId").references("id").inTable(TableName.PkiApiEnrollmentConfig).onDelete("SET NULL");
|
||||
|
||||
t.timestamps(true, true, true);
|
||||
|
||||
t.unique(["slug", "projectId"], { indexName: "certificate_profiles_slug_project_id_unique" });
|
||||
t.unique(["slug", "projectId"]);
|
||||
});
|
||||
|
||||
await createOnUpdateTrigger(knex, TableName.CertificateProfile);
|
||||
@@ -89,7 +90,7 @@ export async function up(knex: Knex): Promise<void> {
|
||||
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||
t.uuid("profileId");
|
||||
t.foreign("profileId").references("id").inTable(TableName.CertificateProfile).onDelete("SET NULL");
|
||||
t.index("profileId", "idx_certificates_profile_id");
|
||||
t.index("profileId");
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -98,7 +99,7 @@ export async function down(knex: Knex): Promise<void> {
|
||||
if (await knex.schema.hasColumn(TableName.Certificate, "profileId")) {
|
||||
await knex.schema.alterTable(TableName.Certificate, (t) => {
|
||||
t.dropForeign(["profileId"]);
|
||||
t.dropIndex("profileId", "idx_certificates_profile_id");
|
||||
t.dropIndex("profileId");
|
||||
t.dropColumn("profileId");
|
||||
});
|
||||
}
|
||||
@@ -106,11 +107,11 @@ export async function down(knex: Knex): Promise<void> {
|
||||
await knex.schema.dropTableIfExists(TableName.CertificateProfile);
|
||||
await dropOnUpdateTrigger(knex, TableName.CertificateProfile);
|
||||
|
||||
await knex.schema.dropTableIfExists(TableName.ApiEnrollmentConfig);
|
||||
await dropOnUpdateTrigger(knex, TableName.ApiEnrollmentConfig);
|
||||
await knex.schema.dropTableIfExists(TableName.PkiApiEnrollmentConfig);
|
||||
await dropOnUpdateTrigger(knex, TableName.PkiApiEnrollmentConfig);
|
||||
|
||||
await knex.schema.dropTableIfExists(TableName.EstEnrollmentConfig);
|
||||
await dropOnUpdateTrigger(knex, TableName.EstEnrollmentConfig);
|
||||
await knex.schema.dropTableIfExists(TableName.PkiEstEnrollmentConfig);
|
||||
await dropOnUpdateTrigger(knex, TableName.PkiEstEnrollmentConfig);
|
||||
|
||||
await knex.schema.dropTableIfExists(TableName.CertificateTemplateV2);
|
||||
await dropOnUpdateTrigger(knex, TableName.CertificateTemplateV2);
|
||||
|
||||
@@ -12,7 +12,6 @@ export const CertificateProfilesSchema = z.object({
|
||||
projectId: z.string(),
|
||||
caId: z.string().uuid(),
|
||||
certificateTemplateId: z.string().uuid(),
|
||||
name: z.string(),
|
||||
slug: z.string(),
|
||||
description: z.string().nullable().optional(),
|
||||
enrollmentType: z.string(),
|
||||
|
||||
@@ -10,7 +10,7 @@ import { TImmutableDBKeys } from "./models";
|
||||
export const CertificateTemplatesV2Schema = z.object({
|
||||
id: z.string().uuid(),
|
||||
projectId: z.string(),
|
||||
name: z.string(),
|
||||
slug: z.string(),
|
||||
description: z.string().nullable().optional(),
|
||||
attributes: z.unknown().nullable().optional(),
|
||||
keyUsages: z.unknown().nullable().optional(),
|
||||
|
||||
@@ -3,7 +3,6 @@ export * from "./access-approval-policies-approvers";
|
||||
export * from "./access-approval-policies-bypassers";
|
||||
export * from "./access-approval-requests";
|
||||
export * from "./access-approval-requests-reviewers";
|
||||
export * from "./api-enrollment-configs";
|
||||
export * from "./api-keys";
|
||||
export * from "./app-connections";
|
||||
export * from "./audit-log-streams";
|
||||
@@ -24,7 +23,6 @@ export * from "./certificate-templates-v2";
|
||||
export * from "./certificates";
|
||||
export * from "./dynamic-secret-leases";
|
||||
export * from "./dynamic-secrets";
|
||||
export * from "./est-enrollment-configs";
|
||||
export * from "./external-certificate-authorities";
|
||||
export * from "./external-group-org-role-mappings";
|
||||
export * from "./external-kms";
|
||||
@@ -92,8 +90,10 @@ export * from "./pam-folders";
|
||||
export * from "./pam-resources";
|
||||
export * from "./pam-sessions";
|
||||
export * from "./pki-alerts";
|
||||
export * from "./pki-api-enrollment-configs";
|
||||
export * from "./pki-collection-items";
|
||||
export * from "./pki-collections";
|
||||
export * from "./pki-est-enrollment-configs";
|
||||
export * from "./pki-subscribers";
|
||||
export * from "./pki-syncs";
|
||||
export * from "./project-bots";
|
||||
|
||||
@@ -25,8 +25,8 @@ export enum TableName {
|
||||
CertificateTemplate = "certificate_templates",
|
||||
CertificateTemplateV2 = "certificate_templates_v2",
|
||||
CertificateProfile = "certificate_profiles",
|
||||
EstEnrollmentConfig = "est_enrollment_configs",
|
||||
ApiEnrollmentConfig = "api_enrollment_configs",
|
||||
PkiEstEnrollmentConfig = "pki_est_enrollment_configs",
|
||||
PkiApiEnrollmentConfig = "pki_api_enrollment_configs",
|
||||
PkiSubscriber = "pki_subscribers",
|
||||
PkiAlert = "pki_alerts",
|
||||
PkiCollection = "pki_collections",
|
||||
|
||||
+6
-4
@@ -7,7 +7,7 @@ import { z } from "zod";
|
||||
|
||||
import { TImmutableDBKeys } from "./models";
|
||||
|
||||
export const ApiEnrollmentConfigsSchema = z.object({
|
||||
export const PkiApiEnrollmentConfigsSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
autoRenew: z.boolean().default(false).nullable().optional(),
|
||||
autoRenewDays: z.number().nullable().optional(),
|
||||
@@ -15,6 +15,8 @@ export const ApiEnrollmentConfigsSchema = z.object({
|
||||
updatedAt: z.date()
|
||||
});
|
||||
|
||||
export type TApiEnrollmentConfigs = z.infer<typeof ApiEnrollmentConfigsSchema>;
|
||||
export type TApiEnrollmentConfigsInsert = Omit<z.input<typeof ApiEnrollmentConfigsSchema>, TImmutableDBKeys>;
|
||||
export type TApiEnrollmentConfigsUpdate = Partial<Omit<z.input<typeof ApiEnrollmentConfigsSchema>, TImmutableDBKeys>>;
|
||||
export type TPkiApiEnrollmentConfigs = z.infer<typeof PkiApiEnrollmentConfigsSchema>;
|
||||
export type TPkiApiEnrollmentConfigsInsert = Omit<z.input<typeof PkiApiEnrollmentConfigsSchema>, TImmutableDBKeys>;
|
||||
export type TPkiApiEnrollmentConfigsUpdate = Partial<
|
||||
Omit<z.input<typeof PkiApiEnrollmentConfigsSchema>, TImmutableDBKeys>
|
||||
>;
|
||||
+6
-4
@@ -9,7 +9,7 @@ import { zodBuffer } from "@app/lib/zod";
|
||||
|
||||
import { TImmutableDBKeys } from "./models";
|
||||
|
||||
export const EstEnrollmentConfigsSchema = z.object({
|
||||
export const PkiEstEnrollmentConfigsSchema = z.object({
|
||||
id: z.string().uuid(),
|
||||
disableBootstrapCaValidation: z.boolean().default(false).nullable().optional(),
|
||||
hashedPassphrase: z.string(),
|
||||
@@ -18,6 +18,8 @@ export const EstEnrollmentConfigsSchema = z.object({
|
||||
updatedAt: z.date()
|
||||
});
|
||||
|
||||
export type TEstEnrollmentConfigs = z.infer<typeof EstEnrollmentConfigsSchema>;
|
||||
export type TEstEnrollmentConfigsInsert = Omit<z.input<typeof EstEnrollmentConfigsSchema>, TImmutableDBKeys>;
|
||||
export type TEstEnrollmentConfigsUpdate = Partial<Omit<z.input<typeof EstEnrollmentConfigsSchema>, TImmutableDBKeys>>;
|
||||
export type TPkiEstEnrollmentConfigs = z.infer<typeof PkiEstEnrollmentConfigsSchema>;
|
||||
export type TPkiEstEnrollmentConfigsInsert = Omit<z.input<typeof PkiEstEnrollmentConfigsSchema>, TImmutableDBKeys>;
|
||||
export type TPkiEstEnrollmentConfigsUpdate = Partial<
|
||||
Omit<z.input<typeof PkiEstEnrollmentConfigsSchema>, TImmutableDBKeys>
|
||||
>;
|
||||
@@ -352,14 +352,10 @@ export enum EventType {
|
||||
UPDATE_CERTIFICATE_TEMPLATE = "update-certificate-template",
|
||||
DELETE_CERTIFICATE_TEMPLATE = "delete-certificate-template",
|
||||
GET_CERTIFICATE_TEMPLATE = "get-certificate-template",
|
||||
LIST_CERTIFICATE_TEMPLATES = "list-certificate-templates",
|
||||
CREATE_CERTIFICATE_TEMPLATE_EST_CONFIG = "create-certificate-template-est-config",
|
||||
UPDATE_CERTIFICATE_TEMPLATE_EST_CONFIG = "update-certificate-template-est-config",
|
||||
GET_CERTIFICATE_TEMPLATE_EST_CONFIG = "get-certificate-template-est-config",
|
||||
CREATE_CERTIFICATE_TEMPLATE_V2 = "create-certificate-template-v2",
|
||||
UPDATE_CERTIFICATE_TEMPLATE_V2 = "update-certificate-template-v2",
|
||||
DELETE_CERTIFICATE_TEMPLATE_V2 = "delete-certificate-template-v2",
|
||||
GET_CERTIFICATE_TEMPLATE_V2 = "get-certificate-template-v2",
|
||||
LIST_CERTIFICATE_TEMPLATES_V2 = "list-certificate-templates-v2",
|
||||
CREATE_CERTIFICATE_PROFILE = "create-certificate-profile",
|
||||
UPDATE_CERTIFICATE_PROFILE = "update-certificate-profile",
|
||||
DELETE_CERTIFICATE_PROFILE = "delete-certificate-profile",
|
||||
@@ -2525,46 +2521,6 @@ interface LoadProjectKmsBackupEvent {
|
||||
metadata: Record<string, string>; // no metadata yet
|
||||
}
|
||||
|
||||
interface CreateCertificateTemplate {
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
caId: string;
|
||||
pkiCollectionId?: string;
|
||||
name: string;
|
||||
commonName: string;
|
||||
subjectAlternativeName: string;
|
||||
ttl: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface GetCertificateTemplate {
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface UpdateCertificateTemplate {
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
caId: string;
|
||||
pkiCollectionId?: string;
|
||||
name: string;
|
||||
commonName: string;
|
||||
subjectAlternativeName: string;
|
||||
ttl: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface DeleteCertificateTemplate {
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface OrgAdminAccessProjectEvent {
|
||||
type: EventType.ORG_ADMIN_ACCESS_PROJECT;
|
||||
metadata: {
|
||||
@@ -2611,8 +2567,8 @@ interface GetCertificateTemplateEstConfig {
|
||||
};
|
||||
}
|
||||
|
||||
interface CreateCertificateTemplateV2 {
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE_V2;
|
||||
interface CreateCertificateTemplate {
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
name: string;
|
||||
@@ -2620,30 +2576,32 @@ interface CreateCertificateTemplateV2 {
|
||||
};
|
||||
}
|
||||
|
||||
interface UpdateCertificateTemplateV2 {
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE_V2;
|
||||
interface UpdateCertificateTemplate {
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
name: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface DeleteCertificateTemplateV2 {
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE_V2;
|
||||
interface DeleteCertificateTemplate {
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
name: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface GetCertificateTemplateV2 {
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE_V2;
|
||||
interface GetCertificateTemplate {
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE;
|
||||
metadata: {
|
||||
certificateTemplateId: string;
|
||||
name: string;
|
||||
};
|
||||
}
|
||||
|
||||
interface ListCertificateTemplatesV2 {
|
||||
type: EventType.LIST_CERTIFICATE_TEMPLATES_V2;
|
||||
interface ListCertificateTemplates {
|
||||
type: EventType.LIST_CERTIFICATE_TEMPLATES;
|
||||
metadata: {
|
||||
projectId: string;
|
||||
};
|
||||
@@ -2710,7 +2668,7 @@ interface OrderCertificateFromProfile {
|
||||
metadata: {
|
||||
certificateProfileId: string;
|
||||
orderId: string;
|
||||
identifiers: string[];
|
||||
subjectAlternativeNames: string[];
|
||||
};
|
||||
}
|
||||
|
||||
@@ -4167,18 +4125,14 @@ export type Event =
|
||||
| LoadProjectKmsBackupEvent
|
||||
| OrgAdminAccessProjectEvent
|
||||
| OrgAdminBypassSSOEvent
|
||||
| CreateCertificateTemplate
|
||||
| UpdateCertificateTemplate
|
||||
| GetCertificateTemplate
|
||||
| DeleteCertificateTemplate
|
||||
| CreateCertificateTemplateEstConfig
|
||||
| UpdateCertificateTemplateEstConfig
|
||||
| GetCertificateTemplateEstConfig
|
||||
| CreateCertificateTemplateV2
|
||||
| UpdateCertificateTemplateV2
|
||||
| DeleteCertificateTemplateV2
|
||||
| GetCertificateTemplateV2
|
||||
| ListCertificateTemplatesV2
|
||||
| CreateCertificateTemplate
|
||||
| UpdateCertificateTemplate
|
||||
| DeleteCertificateTemplate
|
||||
| GetCertificateTemplate
|
||||
| ListCertificateTemplates
|
||||
| CreateCertificateProfile
|
||||
| UpdateCertificateProfile
|
||||
| DeleteCertificateProfile
|
||||
|
||||
@@ -455,6 +455,7 @@ const buildMemberPermissionRules = () => {
|
||||
|
||||
// double check if all CRUD are needed for CA and Certificates
|
||||
can([ProjectPermissionActions.Read], ProjectPermissionSub.CertificateAuthorities);
|
||||
can([ProjectPermissionPkiTemplateActions.Read], ProjectPermissionSub.CertificateTemplates);
|
||||
|
||||
can(
|
||||
[
|
||||
|
||||
@@ -9,7 +9,6 @@ import { AuthMode } from "@app/services/auth/auth-type";
|
||||
import {
|
||||
createCertificateProfileSchema,
|
||||
deleteCertificateProfileSchema,
|
||||
getCertificateProfileByIdSchema,
|
||||
listCertificateProfilesSchema,
|
||||
updateCertificateProfileSchema
|
||||
} from "@app/services/certificate-profile/certificate-profile-schemas";
|
||||
@@ -49,7 +48,7 @@ export const registerCertificateProfilesRouter = async (server: FastifyZodProvid
|
||||
type: EventType.CREATE_CERTIFICATE_PROFILE,
|
||||
metadata: {
|
||||
certificateProfileId: certificateProfile.id,
|
||||
name: certificateProfile.name,
|
||||
name: certificateProfile.slug,
|
||||
projectId: certificateProfile.projectId,
|
||||
enrollmentType: certificateProfile.enrollmentType
|
||||
}
|
||||
@@ -125,7 +124,9 @@ export const registerCertificateProfilesRouter = async (server: FastifyZodProvid
|
||||
schema: {
|
||||
hide: false,
|
||||
tags: [ApiDocsTags.PkiCertificateProfiles],
|
||||
params: getCertificateProfileByIdSchema,
|
||||
params: z.object({
|
||||
id: z.string().min(1)
|
||||
}),
|
||||
querystring: z.object({
|
||||
includeMetrics: z.coerce.boolean().optional().default(false),
|
||||
expiringDays: z.coerce.number().min(1).max(365).optional().default(7)
|
||||
@@ -262,7 +263,9 @@ export const registerCertificateProfilesRouter = async (server: FastifyZodProvid
|
||||
schema: {
|
||||
hide: false,
|
||||
tags: [ApiDocsTags.PkiCertificateProfiles],
|
||||
params: getCertificateProfileByIdSchema,
|
||||
params: z.object({
|
||||
id: z.string().min(1)
|
||||
}),
|
||||
body: updateCertificateProfileSchema,
|
||||
response: {
|
||||
200: z.object({
|
||||
@@ -288,7 +291,7 @@ export const registerCertificateProfilesRouter = async (server: FastifyZodProvid
|
||||
type: EventType.UPDATE_CERTIFICATE_PROFILE,
|
||||
metadata: {
|
||||
certificateProfileId: certificateProfile.id,
|
||||
name: certificateProfile.name
|
||||
name: certificateProfile.slug
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -347,7 +350,9 @@ export const registerCertificateProfilesRouter = async (server: FastifyZodProvid
|
||||
schema: {
|
||||
hide: false,
|
||||
tags: [ApiDocsTags.PkiCertificateProfiles],
|
||||
params: getCertificateProfileByIdSchema,
|
||||
params: z.object({
|
||||
id: z.string().min(1)
|
||||
}),
|
||||
querystring: z.object({
|
||||
offset: z.number().min(0).default(0),
|
||||
limit: z.number().min(1).max(100).default(20),
|
||||
|
||||
@@ -52,7 +52,8 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid
|
||||
event: {
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.name
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -116,12 +117,8 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
caId: certificateTemplate.caId,
|
||||
pkiCollectionId: certificateTemplate.pkiCollectionId as string,
|
||||
name: certificateTemplate.name,
|
||||
commonName: certificateTemplate.commonName,
|
||||
subjectAlternativeName: certificateTemplate.subjectAlternativeName,
|
||||
ttl: certificateTemplate.ttl
|
||||
projectId: certificateTemplate.projectId
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -184,12 +181,7 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
caId: certificateTemplate.caId,
|
||||
pkiCollectionId: certificateTemplate.pkiCollectionId as string,
|
||||
name: certificateTemplate.name,
|
||||
commonName: certificateTemplate.commonName,
|
||||
subjectAlternativeName: certificateTemplate.subjectAlternativeName,
|
||||
ttl: certificateTemplate.ttl
|
||||
name: certificateTemplate.name
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -230,7 +222,8 @@ export const registerCertificateTemplateRouter = async (server: FastifyZodProvid
|
||||
event: {
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.name
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -48,10 +48,10 @@ export const registerCertificateTemplatesV2Router = async (server: FastifyZodPro
|
||||
...req.auditLogInfo,
|
||||
projectId,
|
||||
event: {
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE_V2,
|
||||
type: EventType.CREATE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.name,
|
||||
name: certificateTemplate.slug,
|
||||
projectId: certificateTemplate.projectId
|
||||
}
|
||||
}
|
||||
@@ -92,7 +92,7 @@ export const registerCertificateTemplatesV2Router = async (server: FastifyZodPro
|
||||
...req.auditLogInfo,
|
||||
projectId: req.query.projectId,
|
||||
event: {
|
||||
type: EventType.LIST_CERTIFICATE_TEMPLATES_V2,
|
||||
type: EventType.LIST_CERTIFICATE_TEMPLATES,
|
||||
metadata: {
|
||||
projectId: req.query.projectId
|
||||
}
|
||||
@@ -133,9 +133,10 @@ export const registerCertificateTemplatesV2Router = async (server: FastifyZodPro
|
||||
...req.auditLogInfo,
|
||||
projectId: certificateTemplate.projectId,
|
||||
event: {
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE_V2,
|
||||
type: EventType.GET_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.slug
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -176,10 +177,10 @@ export const registerCertificateTemplatesV2Router = async (server: FastifyZodPro
|
||||
...req.auditLogInfo,
|
||||
projectId: certificateTemplate.projectId,
|
||||
event: {
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE_V2,
|
||||
type: EventType.UPDATE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.name
|
||||
name: certificateTemplate.slug
|
||||
}
|
||||
}
|
||||
});
|
||||
@@ -218,9 +219,10 @@ export const registerCertificateTemplatesV2Router = async (server: FastifyZodPro
|
||||
...req.auditLogInfo,
|
||||
projectId: certificateTemplate.projectId,
|
||||
event: {
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE_V2,
|
||||
type: EventType.DELETE_CERTIFICATE_TEMPLATE,
|
||||
metadata: {
|
||||
certificateTemplateId: certificateTemplate.id
|
||||
certificateTemplateId: certificateTemplate.id,
|
||||
name: certificateTemplate.slug
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -196,7 +196,7 @@ export const registerCertificatesRouter = async (server: FastifyZodProvider) =>
|
||||
tags: [ApiDocsTags.PkiCertificates],
|
||||
body: z.object({
|
||||
profileId: z.string().uuid(),
|
||||
identifiers: z
|
||||
subjectAlternativeNames: z
|
||||
.array(
|
||||
z.object({
|
||||
type: z.enum(["dns", "ip"]),
|
||||
@@ -217,7 +217,7 @@ export const registerCertificatesRouter = async (server: FastifyZodProvider) =>
|
||||
200: z.object({
|
||||
orderId: z.string(),
|
||||
status: z.enum(["pending", "processing", "valid", "invalid"]),
|
||||
identifiers: z.array(
|
||||
subjectAlternativeNames: z.array(
|
||||
z.object({
|
||||
type: z.enum(["dns", "ip"]),
|
||||
value: z.string(),
|
||||
@@ -256,7 +256,7 @@ export const registerCertificatesRouter = async (server: FastifyZodProvider) =>
|
||||
actorOrgId: req.permission.orgId,
|
||||
profileId: req.body.profileId,
|
||||
certificateOrder: {
|
||||
identifiers: req.body.identifiers,
|
||||
subjectAlternativeNames: req.body.subjectAlternativeNames,
|
||||
validity: {
|
||||
ttl: req.body.ttl
|
||||
},
|
||||
@@ -286,7 +286,7 @@ export const registerCertificatesRouter = async (server: FastifyZodProvider) =>
|
||||
metadata: {
|
||||
certificateProfileId: req.body.profileId,
|
||||
orderId: data.orderId,
|
||||
identifiers: req.body.identifiers.map((id) => `${id.type}:${id.value}`)
|
||||
subjectAlternativeNames: req.body.subjectAlternativeNames.map((san) => `${san.type}:${san.value}`)
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -68,18 +68,24 @@ export const certificateProfileDALFactory = (db: TDbClient) => {
|
||||
(tx || db).ref("name").withSchema(TableName.CertificateAuthority).as("caName"),
|
||||
(tx || db).ref("id").withSchema(TableName.CertificateTemplateV2).as("templateId"),
|
||||
(tx || db).ref("projectId").withSchema(TableName.CertificateTemplateV2).as("templateProjectId"),
|
||||
(tx || db).ref("name").withSchema(TableName.CertificateTemplateV2).as("templateName"),
|
||||
(tx || db).ref("slug").withSchema(TableName.CertificateTemplateV2).as("templateName"),
|
||||
(tx || db).ref("description").withSchema(TableName.CertificateTemplateV2).as("templateDescription"),
|
||||
(tx || db).ref("id").withSchema(TableName.EstEnrollmentConfig).as("estConfigId"),
|
||||
(tx || db).ref("id").withSchema(TableName.PkiEstEnrollmentConfig).as("estConfigId"),
|
||||
(tx || db)
|
||||
.ref("disableBootstrapCaValidation")
|
||||
.withSchema(TableName.EstEnrollmentConfig)
|
||||
.withSchema(TableName.PkiEstEnrollmentConfig)
|
||||
.as("estConfigDisableBootstrapCaValidation"),
|
||||
(tx || db).ref("hashedPassphrase").withSchema(TableName.EstEnrollmentConfig).as("estConfigHashedPassphrase"),
|
||||
(tx || db).ref("encryptedCaChain").withSchema(TableName.EstEnrollmentConfig).as("estConfigEncryptedCaChain"),
|
||||
(tx || db).ref("id").withSchema(TableName.ApiEnrollmentConfig).as("apiConfigId"),
|
||||
(tx || db).ref("autoRenew").withSchema(TableName.ApiEnrollmentConfig).as("apiConfigAutoRenew"),
|
||||
(tx || db).ref("autoRenewDays").withSchema(TableName.ApiEnrollmentConfig).as("apiConfigAutoRenewDays")
|
||||
(tx || db)
|
||||
.ref("hashedPassphrase")
|
||||
.withSchema(TableName.PkiEstEnrollmentConfig)
|
||||
.as("estConfigHashedPassphrase"),
|
||||
(tx || db)
|
||||
.ref("encryptedCaChain")
|
||||
.withSchema(TableName.PkiEstEnrollmentConfig)
|
||||
.as("estConfigEncryptedCaChain"),
|
||||
(tx || db).ref("id").withSchema(TableName.PkiApiEnrollmentConfig).as("apiConfigId"),
|
||||
(tx || db).ref("autoRenew").withSchema(TableName.PkiApiEnrollmentConfig).as("apiConfigAutoRenew"),
|
||||
(tx || db).ref("autoRenewDays").withSchema(TableName.PkiApiEnrollmentConfig).as("apiConfigAutoRenewDays")
|
||||
)
|
||||
.leftJoin(
|
||||
TableName.CertificateAuthority,
|
||||
@@ -92,14 +98,14 @@ export const certificateProfileDALFactory = (db: TDbClient) => {
|
||||
`${TableName.CertificateTemplateV2}.id`
|
||||
)
|
||||
.leftJoin(
|
||||
TableName.EstEnrollmentConfig,
|
||||
TableName.PkiEstEnrollmentConfig,
|
||||
`${TableName.CertificateProfile}.estConfigId`,
|
||||
`${TableName.EstEnrollmentConfig}.id`
|
||||
`${TableName.PkiEstEnrollmentConfig}.id`
|
||||
)
|
||||
.leftJoin(
|
||||
TableName.ApiEnrollmentConfig,
|
||||
TableName.PkiApiEnrollmentConfig,
|
||||
`${TableName.CertificateProfile}.apiConfigId`,
|
||||
`${TableName.ApiEnrollmentConfig}.id`
|
||||
`${TableName.PkiApiEnrollmentConfig}.id`
|
||||
)
|
||||
.where(`${TableName.CertificateProfile}.id`, id)
|
||||
.first();
|
||||
@@ -151,9 +157,8 @@ export const certificateProfileDALFactory = (db: TDbClient) => {
|
||||
if (search) {
|
||||
query = query.where((builder) => {
|
||||
void builder
|
||||
.whereILike(`${TableName.CertificateProfile}.name`, `%${search}%`)
|
||||
.orWhereILike(`${TableName.CertificateProfile}.description`, `%${search}%`)
|
||||
.orWhereILike(`${TableName.CertificateProfile}.slug`, `%${search}%`);
|
||||
.whereILike(`${TableName.CertificateProfile}.slug`, `%${search}%`)
|
||||
.orWhereILike(`${TableName.CertificateProfile}.description`, `%${search}%`);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -225,10 +230,7 @@ export const certificateProfileDALFactory = (db: TDbClient) => {
|
||||
|
||||
if (search) {
|
||||
query = query.where((builder) => {
|
||||
void builder
|
||||
.whereILike("name", `%${search}%`)
|
||||
.orWhereILike("description", `%${search}%`)
|
||||
.orWhereILike("slug", `%${search}%`);
|
||||
void builder.orWhereILike("description", `%${search}%`).orWhereILike("slug", `%${search}%`);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -249,7 +251,9 @@ export const certificateProfileDALFactory = (db: TDbClient) => {
|
||||
|
||||
const findByNameAndProjectId = async (name: string, projectId: string, tx?: Knex) => {
|
||||
try {
|
||||
const certificateProfile = await (tx || db)(TableName.CertificateProfile).where({ name, projectId }).first();
|
||||
const certificateProfile = await (tx || db)(TableName.CertificateProfile)
|
||||
.where({ slug: name, projectId })
|
||||
.first();
|
||||
return certificateProfile;
|
||||
} catch (error) {
|
||||
throw new DatabaseError({ error, name: "Find certificate profile by name and project id" });
|
||||
|
||||
@@ -8,7 +8,6 @@ export const createCertificateProfileSchema = z
|
||||
projectId: z.string().min(1),
|
||||
caId: z.string().uuid(),
|
||||
certificateTemplateId: z.string().uuid(),
|
||||
name: z.string().min(1).max(255),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
@@ -46,7 +45,6 @@ export const createCertificateProfileSchema = z
|
||||
);
|
||||
|
||||
export const updateCertificateProfileSchema = z.object({
|
||||
name: z.string().min(1).max(255).optional(),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
|
||||
@@ -80,7 +80,6 @@ describe("CertificateProfileService", () => {
|
||||
const sampleProfile: TCertificateProfile = {
|
||||
id: "profile-123",
|
||||
projectId: "project-123",
|
||||
name: "Test Profile",
|
||||
description: "Test certificate profile",
|
||||
slug: "test-profile",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
@@ -174,9 +173,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
describe("createProfile", () => {
|
||||
const validProfileData = {
|
||||
name: "New Profile",
|
||||
description: "New test profile",
|
||||
slug: "new-profile",
|
||||
description: "New test profile",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -204,9 +202,8 @@ describe("CertificateProfileService", () => {
|
||||
expect(mockCertificateTemplateV2DAL.findById).toHaveBeenCalledWith("template-123");
|
||||
expect(mockCertificateProfileDAL.findBySlugAndProjectId).toHaveBeenCalledWith("new-profile", "project-123");
|
||||
expect(mockCertificateProfileDAL.create).toHaveBeenCalledWith({
|
||||
name: "New Profile",
|
||||
description: "New test profile",
|
||||
slug: "new-profile",
|
||||
description: "New test profile",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -273,9 +270,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should throw ForbiddenRequestError for API enrollment without API config", async () => {
|
||||
const invalidData = {
|
||||
name: "Invalid Profile",
|
||||
description: "Invalid test profile",
|
||||
slug: "invalid-profile",
|
||||
description: "Invalid test profile",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123"
|
||||
@@ -292,9 +288,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should create profile with API enrollment", async () => {
|
||||
const apiProfileData = {
|
||||
name: "API Profile",
|
||||
description: "Profile with API enrollment",
|
||||
slug: "api-profile",
|
||||
description: "Profile with API enrollment",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -317,7 +312,7 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
describe("updateProfile", () => {
|
||||
const updateData = {
|
||||
name: "Updated Profile",
|
||||
slug: "updated-profile",
|
||||
description: "Updated description"
|
||||
};
|
||||
|
||||
@@ -333,7 +328,7 @@ describe("CertificateProfileService", () => {
|
||||
data: updateData
|
||||
});
|
||||
|
||||
expect(result.name).toBe("Updated Profile");
|
||||
expect(result.slug).toBe("updated-profile");
|
||||
expect(mockCertificateProfileDAL.findById).toHaveBeenCalledWith("profile-123");
|
||||
expect(mockCertificateProfileDAL.updateById).toHaveBeenCalledWith("profile-123", updateData);
|
||||
});
|
||||
@@ -697,9 +692,8 @@ describe("CertificateProfileService", () => {
|
||||
describe("profile configuration validation", () => {
|
||||
it("should validate EST enrollment configuration", async () => {
|
||||
const estProfileData = {
|
||||
name: "EST Profile",
|
||||
description: "Profile with EST enrollment",
|
||||
slug: "est-profile",
|
||||
description: "Profile with EST enrollment",
|
||||
enrollmentType: EnrollmentType.EST,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -737,9 +731,8 @@ describe("CertificateProfileService", () => {
|
||||
vi.clearAllMocks();
|
||||
|
||||
const duplicateSlugData = {
|
||||
name: "Different Profile Name",
|
||||
slug: "different-profile-name",
|
||||
description: "Profile with duplicate slug",
|
||||
slug: "test-profile",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -763,9 +756,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should validate auto-renewal configuration", async () => {
|
||||
const autoRenewData = {
|
||||
name: "Auto Renew Profile",
|
||||
slug: "auto-renew-profile",
|
||||
description: "Profile with auto-renewal",
|
||||
slug: "auto-renew",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -987,9 +979,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should handle invalid template reference during profile creation", async () => {
|
||||
const profileData = {
|
||||
name: "Invalid Template Profile",
|
||||
slug: "invalid-template-profile",
|
||||
description: "Profile with invalid template",
|
||||
slug: "invalid-template",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "nonexistent-template",
|
||||
@@ -1013,9 +1004,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should handle concurrent profile creation conflicts", async () => {
|
||||
const conflictingData = {
|
||||
name: "Concurrent Profile",
|
||||
description: "Profile created concurrently",
|
||||
slug: "concurrent-profile",
|
||||
description: "Profile created concurrently",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
@@ -1042,9 +1032,8 @@ describe("CertificateProfileService", () => {
|
||||
describe("permission and security", () => {
|
||||
it("should validate project ownership for cross-project template access", async () => {
|
||||
const crossProjectData = {
|
||||
name: "Cross Project Profile",
|
||||
slug: "cross-project-profile",
|
||||
description: "Profile using template from different project",
|
||||
slug: "cross-project",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-456",
|
||||
@@ -1056,7 +1045,7 @@ describe("CertificateProfileService", () => {
|
||||
const foreignTemplate = {
|
||||
id: "template-456",
|
||||
projectId: "different-project-456",
|
||||
name: "Foreign Template"
|
||||
slug: "foreign-template"
|
||||
};
|
||||
|
||||
(mockCertificateTemplateV2DAL.findById as any).mockResolvedValue(foreignTemplate);
|
||||
@@ -1072,9 +1061,8 @@ describe("CertificateProfileService", () => {
|
||||
|
||||
it("should validate slug format constraints", async () => {
|
||||
const invalidSlugData = {
|
||||
name: "Invalid Slug Profile",
|
||||
slug: "invalid-slug-profile",
|
||||
description: "Profile with invalid slug format",
|
||||
slug: "Invalid_Slug_With_Underscores_And_Caps",
|
||||
enrollmentType: EnrollmentType.API,
|
||||
caId: "ca-123",
|
||||
certificateTemplateId: "template-123",
|
||||
|
||||
@@ -277,7 +277,28 @@ export const certificateProfileServiceFactory = ({
|
||||
});
|
||||
}
|
||||
|
||||
const updatedProfile = await certificateProfileDAL.updateById(profileId, data);
|
||||
const { estConfig, apiConfig, ...profileUpdateData } = data;
|
||||
|
||||
if (estConfig && existingProfile.estConfigId) {
|
||||
await estEnrollmentConfigDAL.updateById(existingProfile.estConfigId, {
|
||||
disableBootstrapCaValidation: estConfig.disableBootstrapCaValidation,
|
||||
...(estConfig.passphrase && {
|
||||
hashedPassphrase: await crypto.hashing().createHash(estConfig.passphrase, getConfig().SALT_ROUNDS)
|
||||
}),
|
||||
...(estConfig.caChain && {
|
||||
encryptedCaChain: Buffer.from(estConfig.caChain, "base64")
|
||||
})
|
||||
});
|
||||
}
|
||||
|
||||
if (apiConfig && existingProfile.apiConfigId) {
|
||||
await apiEnrollmentConfigDAL.updateById(existingProfile.apiConfigId, {
|
||||
autoRenew: apiConfig.autoRenew,
|
||||
autoRenewDays: apiConfig.autoRenewDays
|
||||
});
|
||||
}
|
||||
|
||||
const updatedProfile = await certificateProfileDAL.updateById(profileId, profileUpdateData);
|
||||
return convertDalToService(updatedProfile);
|
||||
};
|
||||
|
||||
|
||||
@@ -19,6 +19,15 @@ export type TCertificateProfileInsert = Omit<TCertificateProfilesInsert, "enroll
|
||||
|
||||
export type TCertificateProfileUpdate = Omit<TCertificateProfilesUpdate, "enrollmentType"> & {
|
||||
enrollmentType?: EnrollmentType;
|
||||
estConfig?: {
|
||||
disableBootstrapCaValidation?: boolean;
|
||||
passphrase?: string;
|
||||
caChain?: string;
|
||||
};
|
||||
apiConfig?: {
|
||||
autoRenew?: boolean;
|
||||
autoRenewDays?: number;
|
||||
};
|
||||
};
|
||||
|
||||
export type TCertificateProfileWithConfigs = TCertificateProfile & {
|
||||
|
||||
@@ -139,7 +139,7 @@ export const certificateTemplateV2DALFactory = (db: TDbClient) => {
|
||||
|
||||
if (search) {
|
||||
query = query.where((builder) => {
|
||||
void builder.whereILike("name", `%${search}%`).orWhereILike("description", `%${search}%`);
|
||||
void builder.whereILike("slug", `%${search}%`).orWhereILike("description", `%${search}%`);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -165,7 +165,7 @@ export const certificateTemplateV2DALFactory = (db: TDbClient) => {
|
||||
|
||||
if (search) {
|
||||
query = query.where((builder) => {
|
||||
void builder.whereILike("name", `%${search}%`).orWhereILike("description", `%${search}%`);
|
||||
void builder.whereILike("slug", `%${search}%`).orWhereILike("description", `%${search}%`);
|
||||
});
|
||||
}
|
||||
|
||||
@@ -176,10 +176,10 @@ export const certificateTemplateV2DALFactory = (db: TDbClient) => {
|
||||
}
|
||||
};
|
||||
|
||||
const findByNameAndProjectId = async (name: string, projectId: string, tx?: Knex) => {
|
||||
const findBySlugAndProjectId = async (slug: string, projectId: string, tx?: Knex) => {
|
||||
try {
|
||||
const certificateTemplateV2 = await (tx || db)(TableName.CertificateTemplateV2)
|
||||
.where({ name, projectId })
|
||||
.where({ slug, projectId })
|
||||
.first();
|
||||
|
||||
if (!certificateTemplateV2) {
|
||||
@@ -188,7 +188,7 @@ export const certificateTemplateV2DALFactory = (db: TDbClient) => {
|
||||
|
||||
return parseJsonFields(certificateTemplateV2);
|
||||
} catch (error) {
|
||||
throw new DatabaseError({ error, name: "Find certificate template v2 by name and project id" });
|
||||
throw new DatabaseError({ error, name: "Find certificate template v2 by slug and project id" });
|
||||
}
|
||||
};
|
||||
|
||||
@@ -213,7 +213,7 @@ export const certificateTemplateV2DALFactory = (db: TDbClient) => {
|
||||
findById,
|
||||
findByProjectId,
|
||||
countByProjectId,
|
||||
findByNameAndProjectId,
|
||||
findBySlugAndProjectId,
|
||||
isTemplateInUse
|
||||
};
|
||||
};
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import RE2 from "re2";
|
||||
import { z } from "zod";
|
||||
|
||||
const attributeTypeSchema = z.enum(["common_name"]);
|
||||
@@ -87,7 +88,11 @@ export const templateV2KeyAlgorithmSchema = z.object({
|
||||
|
||||
export const createCertificateTemplateV2Schema = z.object({
|
||||
projectId: z.string().min(1),
|
||||
name: z.string().min(1).max(255),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(255)
|
||||
.regex(new RE2("^[a-z0-9-]+$"), "Slug must contain only lowercase letters, numbers, and hyphens"),
|
||||
description: z.string().max(1000).optional(),
|
||||
attributes: z.array(templateV2AttributeSchema).optional(),
|
||||
keyUsages: templateV2KeyUsagesSchema.optional(),
|
||||
@@ -99,7 +104,12 @@ export const createCertificateTemplateV2Schema = z.object({
|
||||
});
|
||||
|
||||
export const updateCertificateTemplateV2Schema = z.object({
|
||||
name: z.string().min(1).max(255).optional(),
|
||||
slug: z
|
||||
.string()
|
||||
.min(1)
|
||||
.max(255)
|
||||
.regex(new RE2("^[a-z0-9-]+$"), "Slug must contain only lowercase letters, numbers, and hyphens")
|
||||
.optional(),
|
||||
description: z.string().max(1000).optional(),
|
||||
attributes: z.array(templateV2AttributeSchema).optional(),
|
||||
keyUsages: templateV2KeyUsagesSchema.optional(),
|
||||
@@ -114,6 +124,11 @@ export const getCertificateTemplateV2ByIdSchema = z.object({
|
||||
id: z.string().uuid()
|
||||
});
|
||||
|
||||
export const getCertificateTemplateV2BySlugSchema = z.object({
|
||||
projectId: z.string().min(1),
|
||||
slug: z.string().min(1)
|
||||
});
|
||||
|
||||
export const listCertificateTemplatesV2Schema = z.object({
|
||||
projectId: z.string().min(1),
|
||||
offset: z.coerce.number().min(0).default(0),
|
||||
|
||||
+6
-4
@@ -27,6 +27,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
let service: TCertificateTemplateV2ServiceFactory;
|
||||
|
||||
const mockCertificateTemplateV2DAL = {
|
||||
findBySlugAndProjectId: vi.fn(),
|
||||
create: vi.fn(),
|
||||
findById: vi.fn(),
|
||||
updateById: vi.fn(),
|
||||
@@ -99,7 +100,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
const sampleTemplate: TCertificateTemplateV2 = {
|
||||
id: "template-123",
|
||||
projectId: "project-123",
|
||||
name: "Web Server Template",
|
||||
slug: "web-server-template",
|
||||
description: "Template for web server certificates",
|
||||
...samplePolicy,
|
||||
createdAt: new Date(),
|
||||
@@ -136,6 +137,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
});
|
||||
|
||||
mockCertificateTemplateV2DAL.findByNameAndProjectId.mockResolvedValue(null);
|
||||
mockCertificateTemplateV2DAL.findBySlugAndProjectId.mockResolvedValue(null);
|
||||
|
||||
service = certificateTemplateV2ServiceFactory({
|
||||
certificateTemplateV2DAL: mockCertificateTemplateV2DAL as TCertificateTemplateV2DALFactory,
|
||||
@@ -149,7 +151,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
|
||||
describe("createTemplateV2", () => {
|
||||
const createData: Omit<TCertificateTemplateV2Insert, "projectId"> = {
|
||||
name: "Test Template",
|
||||
slug: "test-template",
|
||||
description: "Test description",
|
||||
...samplePolicy
|
||||
};
|
||||
@@ -239,7 +241,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
|
||||
describe("updateTemplateV2", () => {
|
||||
it("should update template with valid data", async () => {
|
||||
const updateData = { name: "Updated Template Name" };
|
||||
const updateData = { slug: "updated-template-name" };
|
||||
const updatedTemplate = { ...sampleTemplate, ...updateData };
|
||||
|
||||
mockCertificateTemplateV2DAL.findById.mockResolvedValue(sampleTemplate);
|
||||
@@ -263,7 +265,7 @@ describe("CertificateTemplateV2Service", () => {
|
||||
service.updateTemplateV2({
|
||||
...mockActor,
|
||||
templateId: "nonexistent-template",
|
||||
data: { name: "Updated Name" }
|
||||
data: { slug: "updated-name" }
|
||||
})
|
||||
).rejects.toThrow(NotFoundError);
|
||||
});
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
import { ForbiddenError } from "@casl/ability";
|
||||
import slugify from "@sindresorhus/slugify";
|
||||
import RE2 from "re2";
|
||||
|
||||
import { ActionProjectType } from "@app/db/schemas";
|
||||
@@ -8,6 +9,7 @@ import {
|
||||
ProjectPermissionSub
|
||||
} from "@app/ee/services/permission/project-permission";
|
||||
import { ForbiddenRequestError, NotFoundError } from "@app/lib/errors";
|
||||
import { alphaNumericNanoId } from "@app/lib/nanoid";
|
||||
|
||||
import { ActorAuthMethod, ActorType } from "../auth/auth-type";
|
||||
import { TCertificateTemplateV2DALFactory } from "./certificate-template-v2-dal";
|
||||
@@ -115,6 +117,28 @@ export const certificateTemplateV2ServiceFactory = ({
|
||||
);
|
||||
};
|
||||
|
||||
const generateTemplateSlug = (baseSlug?: string): string => {
|
||||
if (baseSlug) {
|
||||
return slugify(baseSlug);
|
||||
}
|
||||
return slugify(alphaNumericNanoId(12));
|
||||
};
|
||||
|
||||
const ensureUniqueSlug = async (projectId: string, desiredSlug: string, templateId?: string): Promise<string> => {
|
||||
const existingTemplate = await certificateTemplateV2DAL.findBySlugAndProjectId(desiredSlug, projectId);
|
||||
if (!existingTemplate || (templateId && existingTemplate.id === templateId)) {
|
||||
return desiredSlug;
|
||||
}
|
||||
const alternativeSlug = `${desiredSlug}-${alphaNumericNanoId(8)}`;
|
||||
const existingAlternative = await certificateTemplateV2DAL.findBySlugAndProjectId(alternativeSlug, projectId);
|
||||
if (!existingAlternative) {
|
||||
return alternativeSlug;
|
||||
}
|
||||
|
||||
const randomSlug = slugify(alphaNumericNanoId(12));
|
||||
return randomSlug;
|
||||
};
|
||||
|
||||
const validateRequestAgainstPolicy = (
|
||||
template: TCertificateTemplateV2,
|
||||
request: TCertificateRequest
|
||||
@@ -361,8 +385,12 @@ export const certificateTemplateV2ServiceFactory = ({
|
||||
keyAlgorithm: data.keyAlgorithm
|
||||
});
|
||||
|
||||
const slug = data.slug || generateTemplateSlug();
|
||||
const uniqueSlug = await ensureUniqueSlug(projectId, slug);
|
||||
|
||||
const template = await certificateTemplateV2DAL.create({
|
||||
...data,
|
||||
slug: uniqueSlug,
|
||||
projectId
|
||||
});
|
||||
|
||||
@@ -417,7 +445,13 @@ export const certificateTemplateV2ServiceFactory = ({
|
||||
validateTemplatePolicy(mergedPolicy);
|
||||
}
|
||||
|
||||
const updatedTemplate = await certificateTemplateV2DAL.updateById(templateId, data);
|
||||
const updateData = { ...data };
|
||||
if (data.slug && typeof data.slug === "string" && data.slug !== existingTemplate.slug) {
|
||||
const uniqueSlug = await ensureUniqueSlug(existingTemplate.projectId, data.slug, templateId);
|
||||
updateData.slug = uniqueSlug;
|
||||
}
|
||||
|
||||
const updatedTemplate = await certificateTemplateV2DAL.updateById(templateId, updateData);
|
||||
if (!updatedTemplate) {
|
||||
throw new NotFoundError({ message: "Failed to update certificate template" });
|
||||
}
|
||||
@@ -459,6 +493,43 @@ export const certificateTemplateV2ServiceFactory = ({
|
||||
return template;
|
||||
};
|
||||
|
||||
const getTemplateV2BySlug = async ({
|
||||
actor,
|
||||
actorId,
|
||||
actorAuthMethod,
|
||||
actorOrgId,
|
||||
projectId,
|
||||
slug
|
||||
}: {
|
||||
actor: ActorType;
|
||||
actorId: string;
|
||||
actorAuthMethod: ActorAuthMethod;
|
||||
actorOrgId: string;
|
||||
projectId: string;
|
||||
slug: string;
|
||||
}): Promise<TCertificateTemplateV2> => {
|
||||
const { permission } = await permissionService.getProjectPermission({
|
||||
actor,
|
||||
actorId,
|
||||
projectId,
|
||||
actorAuthMethod,
|
||||
actorOrgId,
|
||||
actionProjectType: ActionProjectType.CertificateManager
|
||||
});
|
||||
|
||||
ForbiddenError.from(permission).throwUnlessCan(
|
||||
ProjectPermissionPkiTemplateActions.Read,
|
||||
ProjectPermissionSub.CertificateTemplates
|
||||
);
|
||||
|
||||
const template = await certificateTemplateV2DAL.findBySlugAndProjectId(slug, projectId);
|
||||
if (!template) {
|
||||
throw new NotFoundError({ message: "Certificate template not found" });
|
||||
}
|
||||
|
||||
return template;
|
||||
};
|
||||
|
||||
const listTemplatesV2 = async ({
|
||||
actor,
|
||||
actorId,
|
||||
@@ -571,6 +642,7 @@ export const certificateTemplateV2ServiceFactory = ({
|
||||
createTemplateV2,
|
||||
updateTemplateV2,
|
||||
getTemplateV2ById,
|
||||
getTemplateV2BySlug,
|
||||
listTemplatesV2,
|
||||
deleteTemplateV2,
|
||||
validateCertificateRequest
|
||||
|
||||
@@ -74,7 +74,7 @@ export type TCertificateTemplateV2Insert = Omit<
|
||||
export type TCertificateTemplateV2Update = Partial<
|
||||
Pick<
|
||||
TCertificateTemplateV2,
|
||||
| "name"
|
||||
| "slug"
|
||||
| "description"
|
||||
| "attributes"
|
||||
| "keyUsages"
|
||||
|
||||
@@ -347,7 +347,7 @@ describe("CertificateV3Service", () => {
|
||||
|
||||
describe("orderCertificateFromProfile", () => {
|
||||
const mockCertificateOrder = {
|
||||
identifiers: [{ type: "dns" as const, value: "example.com" }],
|
||||
subjectAlternativeNames: [{ type: "dns" as const, value: "example.com" }],
|
||||
validity: { ttl: "30d" },
|
||||
commonName: "example.com",
|
||||
keyUsages: [CertKeyUsage.DIGITAL_SIGNATURE],
|
||||
@@ -411,8 +411,8 @@ describe("CertificateV3Service", () => {
|
||||
expect(result).toHaveProperty("orderId");
|
||||
expect(result).toHaveProperty("status", "valid");
|
||||
expect(result).toHaveProperty("certificate");
|
||||
expect(result.identifiers).toHaveLength(1);
|
||||
expect(result.identifiers[0]).toEqual({
|
||||
expect(result.subjectAlternativeNames).toHaveLength(1);
|
||||
expect(result.subjectAlternativeNames[0]).toEqual({
|
||||
type: "dns",
|
||||
value: "example.com",
|
||||
status: "valid"
|
||||
|
||||
@@ -293,9 +293,9 @@ export const certificateV3ServiceFactory = ({
|
||||
commonName: certificateOrder.commonName,
|
||||
keyUsages: certificateOrder.keyUsages,
|
||||
extendedKeyUsages: certificateOrder.extendedKeyUsages,
|
||||
subjectAlternativeNames: certificateOrder.identifiers.map((id) => ({
|
||||
type: id.type === "dns" ? ("dns_name" as const) : ("ip_address" as const),
|
||||
value: id.value
|
||||
subjectAlternativeNames: certificateOrder.subjectAlternativeNames.map((san) => ({
|
||||
type: san.type === "dns" ? ("dns_name" as const) : ("ip_address" as const),
|
||||
value: san.value
|
||||
})),
|
||||
validity: certificateOrder.validity,
|
||||
notBefore: certificateOrder.notBefore,
|
||||
@@ -334,16 +334,16 @@ export const certificateV3ServiceFactory = ({
|
||||
});
|
||||
|
||||
const orderId = randomUUID();
|
||||
const identifiers = certificateOrder.identifiers.map((id) => ({
|
||||
type: id.type,
|
||||
value: id.value,
|
||||
const subjectAlternativeNames = certificateOrder.subjectAlternativeNames.map((san) => ({
|
||||
type: san.type,
|
||||
value: san.value,
|
||||
status: "valid" as const
|
||||
}));
|
||||
|
||||
const authorizations = certificateOrder.identifiers.map((id) => ({
|
||||
const authorizations = certificateOrder.subjectAlternativeNames.map((san) => ({
|
||||
identifier: {
|
||||
type: id.type,
|
||||
value: id.value
|
||||
type: san.type,
|
||||
value: san.value
|
||||
},
|
||||
status: "valid" as const,
|
||||
expires: new Date(Date.now() + 30 * 24 * 60 * 60 * 1000).toISOString(),
|
||||
@@ -360,7 +360,7 @@ export const certificateV3ServiceFactory = ({
|
||||
return {
|
||||
orderId,
|
||||
status: "valid",
|
||||
identifiers,
|
||||
subjectAlternativeNames,
|
||||
authorizations,
|
||||
finalize: `/api/v3/certificates/orders/${orderId}/finalize`,
|
||||
certificate: certificateResult.certificate
|
||||
|
||||
@@ -35,7 +35,7 @@ export type TSignCertificateFromProfileDTO = {
|
||||
export type TOrderCertificateFromProfileDTO = {
|
||||
profileId: string;
|
||||
certificateOrder: {
|
||||
identifiers: Array<{
|
||||
subjectAlternativeNames: Array<{
|
||||
type: "dns" | "ip";
|
||||
value: string;
|
||||
}>;
|
||||
@@ -64,7 +64,7 @@ export type TCertificateFromProfileResponse = {
|
||||
export type TCertificateOrderResponse = {
|
||||
orderId: string;
|
||||
status: "pending" | "processing" | "valid" | "invalid";
|
||||
identifiers: Array<{
|
||||
subjectAlternativeNames: Array<{
|
||||
type: "dns" | "ip";
|
||||
value: string;
|
||||
status: "pending" | "processing" | "valid" | "invalid";
|
||||
|
||||
@@ -10,11 +10,11 @@ import { TApiEnrollmentConfigInsert, TApiEnrollmentConfigUpdate } from "./enroll
|
||||
export type TApiEnrollmentConfigDALFactory = ReturnType<typeof apiEnrollmentConfigDALFactory>;
|
||||
|
||||
export const apiEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
const apiEnrollmentConfigOrm = ormify(db, TableName.ApiEnrollmentConfig);
|
||||
const apiEnrollmentConfigOrm = ormify(db, TableName.PkiApiEnrollmentConfig);
|
||||
|
||||
const create = async (data: TApiEnrollmentConfigInsert, tx?: Knex) => {
|
||||
try {
|
||||
const [apiConfig] = await (tx || db)(TableName.ApiEnrollmentConfig).insert(data).returning("*");
|
||||
const [apiConfig] = await (tx || db)(TableName.PkiApiEnrollmentConfig).insert(data).returning("*");
|
||||
|
||||
return apiConfig;
|
||||
} catch (error) {
|
||||
@@ -24,7 +24,7 @@ export const apiEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const updateById = async (id: string, data: TApiEnrollmentConfigUpdate, tx?: Knex) => {
|
||||
try {
|
||||
const [apiConfig] = await (tx || db)(TableName.ApiEnrollmentConfig).where({ id }).update(data).returning("*");
|
||||
const [apiConfig] = await (tx || db)(TableName.PkiApiEnrollmentConfig).where({ id }).update(data).returning("*");
|
||||
|
||||
return apiConfig;
|
||||
} catch (error) {
|
||||
@@ -34,7 +34,7 @@ export const apiEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const deleteById = async (id: string, tx?: Knex) => {
|
||||
try {
|
||||
const [apiConfig] = await (tx || db)(TableName.ApiEnrollmentConfig).where({ id }).del().returning("*");
|
||||
const [apiConfig] = await (tx || db)(TableName.PkiApiEnrollmentConfig).where({ id }).del().returning("*");
|
||||
|
||||
return apiConfig;
|
||||
} catch (error) {
|
||||
@@ -44,7 +44,7 @@ export const apiEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const findById = async (id: string, tx?: Knex) => {
|
||||
try {
|
||||
const apiConfig = await (tx || db)(TableName.ApiEnrollmentConfig).where({ id }).first();
|
||||
const apiConfig = await (tx || db)(TableName.PkiApiEnrollmentConfig).where({ id }).first();
|
||||
|
||||
return apiConfig;
|
||||
} catch (error) {
|
||||
@@ -60,15 +60,15 @@ export const apiEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const profiles = await (tx || db)(TableName.CertificateProfile)
|
||||
.join(
|
||||
TableName.ApiEnrollmentConfig,
|
||||
TableName.PkiApiEnrollmentConfig,
|
||||
`${TableName.CertificateProfile}.apiConfigId`,
|
||||
`${TableName.ApiEnrollmentConfig}.id`
|
||||
`${TableName.PkiApiEnrollmentConfig}.id`
|
||||
)
|
||||
.where(`${TableName.ApiEnrollmentConfig}.autoRenew`, true)
|
||||
.where(`${TableName.PkiApiEnrollmentConfig}.autoRenew`, true)
|
||||
.where((query) => {
|
||||
void query
|
||||
.whereNull(`${TableName.ApiEnrollmentConfig}.autoRenewDays`)
|
||||
.orWhere(`${TableName.ApiEnrollmentConfig}.autoRenewDays`, "<=", renewalThresholdDays);
|
||||
.whereNull(`${TableName.PkiApiEnrollmentConfig}.autoRenewDays`)
|
||||
.orWhere(`${TableName.PkiApiEnrollmentConfig}.autoRenewDays`, "<=", renewalThresholdDays);
|
||||
})
|
||||
.select((tx || db).ref("id").withSchema(TableName.CertificateProfile))
|
||||
.select((tx || db).ref("name").withSchema(TableName.CertificateProfile))
|
||||
|
||||
@@ -1,21 +1,21 @@
|
||||
import {
|
||||
TApiEnrollmentConfigs,
|
||||
TApiEnrollmentConfigsInsert,
|
||||
TApiEnrollmentConfigsUpdate
|
||||
} from "@app/db/schemas/api-enrollment-configs";
|
||||
TPkiApiEnrollmentConfigs,
|
||||
TPkiApiEnrollmentConfigsInsert,
|
||||
TPkiApiEnrollmentConfigsUpdate
|
||||
} from "@app/db/schemas/pki-api-enrollment-configs";
|
||||
import {
|
||||
TEstEnrollmentConfigs,
|
||||
TEstEnrollmentConfigsInsert,
|
||||
TEstEnrollmentConfigsUpdate
|
||||
} from "@app/db/schemas/est-enrollment-configs";
|
||||
TPkiEstEnrollmentConfigs,
|
||||
TPkiEstEnrollmentConfigsInsert,
|
||||
TPkiEstEnrollmentConfigsUpdate
|
||||
} from "@app/db/schemas/pki-est-enrollment-configs";
|
||||
|
||||
export type TEstEnrollmentConfig = TEstEnrollmentConfigs;
|
||||
export type TEstEnrollmentConfigInsert = TEstEnrollmentConfigsInsert;
|
||||
export type TEstEnrollmentConfigUpdate = TEstEnrollmentConfigsUpdate;
|
||||
export type TEstEnrollmentConfig = TPkiEstEnrollmentConfigs;
|
||||
export type TEstEnrollmentConfigInsert = TPkiEstEnrollmentConfigsInsert;
|
||||
export type TEstEnrollmentConfigUpdate = TPkiEstEnrollmentConfigsUpdate;
|
||||
|
||||
export type TApiEnrollmentConfig = TApiEnrollmentConfigs;
|
||||
export type TApiEnrollmentConfigInsert = TApiEnrollmentConfigsInsert;
|
||||
export type TApiEnrollmentConfigUpdate = TApiEnrollmentConfigsUpdate;
|
||||
export type TApiEnrollmentConfig = TPkiApiEnrollmentConfigs;
|
||||
export type TApiEnrollmentConfigInsert = TPkiApiEnrollmentConfigsInsert;
|
||||
export type TApiEnrollmentConfigUpdate = TPkiApiEnrollmentConfigsUpdate;
|
||||
|
||||
export interface TEstConfigData {
|
||||
disableBootstrapCaValidation: boolean;
|
||||
|
||||
@@ -10,11 +10,11 @@ import { TEstEnrollmentConfigInsert, TEstEnrollmentConfigUpdate } from "./enroll
|
||||
export type TEstEnrollmentConfigDALFactory = ReturnType<typeof estEnrollmentConfigDALFactory>;
|
||||
|
||||
export const estEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
const estEnrollmentConfigOrm = ormify(db, TableName.EstEnrollmentConfig);
|
||||
const estEnrollmentConfigOrm = ormify(db, TableName.PkiEstEnrollmentConfig);
|
||||
|
||||
const create = async (data: TEstEnrollmentConfigInsert, tx?: Knex) => {
|
||||
try {
|
||||
const [estConfig] = await (tx || db)(TableName.EstEnrollmentConfig).insert(data).returning("*");
|
||||
const [estConfig] = await (tx || db)(TableName.PkiEstEnrollmentConfig).insert(data).returning("*");
|
||||
|
||||
return estConfig;
|
||||
} catch (error) {
|
||||
@@ -24,7 +24,7 @@ export const estEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const updateById = async (id: string, data: TEstEnrollmentConfigUpdate, tx?: Knex) => {
|
||||
try {
|
||||
const [estConfig] = await (tx || db)(TableName.EstEnrollmentConfig).where({ id }).update(data).returning("*");
|
||||
const [estConfig] = await (tx || db)(TableName.PkiEstEnrollmentConfig).where({ id }).update(data).returning("*");
|
||||
|
||||
return estConfig;
|
||||
} catch (error) {
|
||||
@@ -34,7 +34,7 @@ export const estEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const deleteById = async (id: string, tx?: Knex) => {
|
||||
try {
|
||||
const [estConfig] = await (tx || db)(TableName.EstEnrollmentConfig).where({ id }).del().returning("*");
|
||||
const [estConfig] = await (tx || db)(TableName.PkiEstEnrollmentConfig).where({ id }).del().returning("*");
|
||||
|
||||
return estConfig;
|
||||
} catch (error) {
|
||||
@@ -44,7 +44,7 @@ export const estEnrollmentConfigDALFactory = (db: TDbClient) => {
|
||||
|
||||
const findById = async (id: string, tx?: Knex) => {
|
||||
try {
|
||||
const estConfig = await (tx || db)(TableName.EstEnrollmentConfig).where({ id }).first();
|
||||
const estConfig = await (tx || db)(TableName.PkiEstEnrollmentConfig).where({ id }).first();
|
||||
|
||||
return estConfig;
|
||||
} catch (error) {
|
||||
|
||||
Reference in New Issue
Block a user