3 Commits
dev ... uat

Author SHA1 Message Date
kevin-asprec
357d162d97 revert: remove forced seed from CMD, use post_deployment_command instead 2026-04-15 10:14:50 +08:00
kevin-asprec
0696d37e9b feat: force seed for initial UAT deploy 2026-04-15 09:59:12 +08:00
kevin-asprec
91572829e7 feat: add RUN_SEED support to Dockerfile CMD 2026-04-15 09:48:26 +08:00
4 changed files with 4 additions and 29 deletions

View File

@@ -34,9 +34,10 @@ COPY --from=builder /app/packages/shared/package.json ./packages/shared/
RUN node -e "const p=require('./packages/shared/package.json');p.main='./dist/index.js';require('fs').writeFileSync('./packages/shared/package.json',JSON.stringify(p,null,2))" RUN node -e "const p=require('./packages/shared/package.json');p.main='./dist/index.js';require('fs').writeFileSync('./packages/shared/package.json',JSON.stringify(p,null,2))"
COPY --from=builder /app/packages/db/prisma ./packages/db/prisma COPY --from=builder /app/packages/db/prisma ./packages/db/prisma
COPY --from=builder /app/packages/db/package.json ./packages/db/ COPY --from=builder /app/packages/db/package.json ./packages/db/
COPY --from=builder /app/packages/admin-db/prisma/seed.ts ./packages/admin-db/prisma/seed.ts
COPY --from=builder /app/dist ./dist COPY --from=builder /app/dist ./dist
ENV NODE_ENV=production ENV NODE_ENV=production
EXPOSE 3004 EXPOSE 3004
ENTRYPOINT ["dumb-init", "--"] ENTRYPOINT ["dumb-init", "--"]
CMD ["sh", "-c", "cd packages/admin-db && npx prisma migrate deploy && if [ \"$RUN_SEED\" = \"true\" ]; then echo 'Seeding admin database...' && npx tsx prisma/seed.ts; fi && cd /app && node dist/main.js"] CMD ["sh", "-c", "cd packages/admin-db && npx prisma migrate deploy && cd /app && node dist/main.js"]

View File

@@ -1,24 +0,0 @@
-- CreateTable: support_ticket_attachments
CREATE TABLE "support_ticket_attachments" (
"id" TEXT NOT NULL,
"ticketId" TEXT NOT NULL,
"commentId" TEXT,
"fileName" TEXT NOT NULL,
"originalName" TEXT NOT NULL,
"mimeType" TEXT NOT NULL,
"sizeBytes" INTEGER NOT NULL,
"uploadedBy" TEXT NOT NULL,
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
CONSTRAINT "support_ticket_attachments_pkey" PRIMARY KEY ("id")
);
-- CreateIndex
CREATE INDEX "support_ticket_attachments_ticketId_idx" ON "support_ticket_attachments"("ticketId");
CREATE INDEX "support_ticket_attachments_commentId_idx" ON "support_ticket_attachments"("commentId");
-- AddForeignKey
ALTER TABLE "support_ticket_attachments" ADD CONSTRAINT "support_ticket_attachments_ticketId_fkey"
FOREIGN KEY ("ticketId") REFERENCES "support_tickets"("id") ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE "support_ticket_attachments" ADD CONSTRAINT "support_ticket_attachments_commentId_fkey"
FOREIGN KEY ("commentId") REFERENCES "support_ticket_comments"("id") ON DELETE CASCADE ON UPDATE CASCADE;

View File

@@ -6,7 +6,6 @@ import {
import { JwtService } from '@nestjs/jwt'; import { JwtService } from '@nestjs/jwt';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import * as bcrypt from 'bcrypt'; import * as bcrypt from 'bcrypt';
import { randomUUID } from 'crypto';
import { AdminPrismaService } from '../prisma/admin-prisma.service'; import { AdminPrismaService } from '../prisma/admin-prisma.service';
@Injectable() @Injectable()
@@ -120,7 +119,6 @@ export class AuthService {
sub: adminId, sub: adminId,
email, email,
type: 'super_admin', type: 'super_admin',
jti: randomUUID(),
}); });
const refreshSecret = this.config.get<string>( const refreshSecret = this.config.get<string>(
@@ -133,7 +131,7 @@ export class AuthService {
); );
const refreshToken = this.jwt.sign( const refreshToken = this.jwt.sign(
{ sub: adminId, email, type: 'super_admin', jti: randomUUID() }, { sub: adminId, email, type: 'super_admin' },
{ {
secret: refreshSecret, secret: refreshSecret,
expiresIn: refreshExpiresIn as any, expiresIn: refreshExpiresIn as any,

View File

@@ -15,7 +15,7 @@ export class ImpersonateService {
private readonly audit: AuditService, private readonly audit: AuditService,
) { ) {
// Use the MAIN API's JWT secret so the token works with the tenant API // Use the MAIN API's JWT secret so the token works with the tenant API
this.mainJwtSecret = this.config.get<string>('MAIN_API_JWT_SECRET', 'your-secret-key'); this.mainJwtSecret = this.config.get<string>('JWT_SECRET', 'dev-jwt-secret-not-for-production');
} }
async startImpersonation(tenantId: string, adminId: string, adminName: string) { async startImpersonation(tenantId: string, adminId: string, adminName: string) {