(
secretData: Omit<NewSecret, 'id' | 'createdAt' | 'updatedAt'>,
versionData: Omit<NewSecretVersion, 'id' | 'secretId' | 'version' | 'createdAt' | 'isActive'>,
)
| 199 | } |
| 200 | |
| 201 | async createSecret( |
| 202 | secretData: Omit<NewSecret, 'id' | 'createdAt' | 'updatedAt'>, |
| 203 | versionData: Omit<NewSecretVersion, 'id' | 'secretId' | 'version' | 'createdAt' | 'isActive'>, |
| 204 | ): Promise<SecretSummary> { |
| 205 | try { |
| 206 | return await this.db.transaction(async (tx) => { |
| 207 | const [secret] = await tx |
| 208 | .insert(secrets) |
| 209 | .values({ |
| 210 | ...secretData, |
| 211 | organizationId: secretData.organizationId ?? DEFAULT_ORGANIZATION_ID, |
| 212 | }) |
| 213 | .returning(); |
| 214 | |
| 215 | const newVersionNumber = 1; |
| 216 | |
| 217 | const [insertedVersion] = await tx |
| 218 | .insert(secretVersions) |
| 219 | .values({ |
| 220 | ...versionData, |
| 221 | secretId: secret.id, |
| 222 | version: newVersionNumber, |
| 223 | isActive: true, |
| 224 | organizationId: |
| 225 | versionData.organizationId ?? secret.organizationId ?? DEFAULT_ORGANIZATION_ID, |
| 226 | }) |
| 227 | .returning(); |
| 228 | |
| 229 | const [updatedSecret] = await tx |
| 230 | .update(secrets) |
| 231 | .set({ updatedAt: sql`now()` }) |
| 232 | .where(eq(secrets.id, secret.id)) |
| 233 | .returning(); |
| 234 | |
| 235 | return this.mapSummary({ |
| 236 | id: updatedSecret.id, |
| 237 | name: updatedSecret.name, |
| 238 | description: updatedSecret.description, |
| 239 | tags: updatedSecret.tags, |
| 240 | createdAt: updatedSecret.createdAt, |
| 241 | updatedAt: updatedSecret.updatedAt, |
| 242 | versionId: insertedVersion.id, |
| 243 | version: insertedVersion.version, |
| 244 | versionCreatedAt: insertedVersion.createdAt, |
| 245 | versionCreatedBy: insertedVersion.createdBy, |
| 246 | }); |
| 247 | }); |
| 248 | } catch (error: any) { |
| 249 | if (error?.code === '23505') { |
| 250 | throw new ConflictException(`Secret name '${secretData.name}' already exists`); |
| 251 | } |
| 252 | throw error; |
| 253 | } |
| 254 | } |
| 255 | |
| 256 | async rotateSecret( |
| 257 | secretId: string, |
nothing calls this directly
no test coverage detected