feat: Add authentication, file management with Cloudinary support, and Prisma-integrated file cleanup.

This commit is contained in:
2025-11-27 16:53:44 +03:00
parent 1c583af0ab
commit f07420e418
5 changed files with 13 additions and 9 deletions
+4 -3
View File
@@ -4,6 +4,7 @@ import { PrismaClient } from '@prisma/client';
import { admin } from 'better-auth/plugins'; import { admin } from 'better-auth/plugins';
import { applyFileCleanup } from '../prisma/file-cleanup.helper'; import { applyFileCleanup } from '../prisma/file-cleanup.helper';
import { config } from '../shared/config/config';
const prisma = new PrismaClient(); const prisma = new PrismaClient();
applyFileCleanup(prisma); applyFileCleanup(prisma);
@@ -27,12 +28,12 @@ export const auth = betterAuth({
sendOnSignIn: true, sendOnSignIn: true,
autoSignInAfterVerification: true, autoSignInAfterVerification: true,
}, },
trustedOrigins: ['http://localhost:5173', 'http://localhost:5174'], trustedOrigins: config.trustedOrigins,
socialProviders: { socialProviders: {
google: { google: {
prompt: 'select_account', prompt: 'select_account',
clientId: process.env.GOOGLE_CLIENT_ID!, clientId: config.googleClientId,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!, clientSecret: config.googleClientSecret,
}, },
}, },
}); });
+2 -1
View File
@@ -5,6 +5,7 @@ import { FileController } from './file.controller';
import { PrismaService } from 'src/prisma/prisma.service'; import { PrismaService } from 'src/prisma/prisma.service';
import { LocalStorageProvider } from './storage-providers/local-storage.provider'; import { LocalStorageProvider } from './storage-providers/local-storage.provider';
import { CloudinaryStorageProvider } from './storage-providers/cloudinary-storage.provider'; import { CloudinaryStorageProvider } from './storage-providers/cloudinary-storage.provider';
import { config } from '../shared/config/config';
@Module({ @Module({
controllers: [FileController], controllers: [FileController],
@@ -14,7 +15,7 @@ import { CloudinaryStorageProvider } from './storage-providers/cloudinary-storag
{ {
provide: 'StorageProvider', provide: 'StorageProvider',
useFactory: () => { useFactory: () => {
switch (process.env.FILE_DRIVER) { switch (config.fileDriver) {
case 'cloudinary': case 'cloudinary':
return new CloudinaryStorageProvider(); return new CloudinaryStorageProvider();
default: default:
@@ -1,11 +1,12 @@
// src/file/storage-providers/cloudinary-storage.provider.ts // src/file/storage-providers/cloudinary-storage.provider.ts
import { IStorageProvider } from './storage-provider.interface'; import { IStorageProvider } from './storage-provider.interface';
import { v2 as cloudinary } from 'cloudinary'; import { v2 as cloudinary } from 'cloudinary';
import { config } from '../../shared/config/config';
cloudinary.config({ cloudinary.config({
cloud_name: process.env.CLOUDINARY_CLOUD_NAME, cloud_name: config.cloudinary.cloudName,
api_key: process.env.CLOUDINARY_API_KEY, api_key: config.cloudinary.apiKey,
api_secret: process.env.CLOUDINARY_API_SECRET, api_secret: config.cloudinary.apiSecret,
}); });
export class CloudinaryStorageProvider implements IStorageProvider { export class CloudinaryStorageProvider implements IStorageProvider {
+2 -1
View File
@@ -1,9 +1,10 @@
import { PrismaClient } from '@prisma/client'; import { PrismaClient } from '@prisma/client';
import { LocalStorageProvider } from '../file/storage-providers/local-storage.provider'; import { LocalStorageProvider } from '../file/storage-providers/local-storage.provider';
import { CloudinaryStorageProvider } from '../file/storage-providers/cloudinary-storage.provider'; import { CloudinaryStorageProvider } from '../file/storage-providers/cloudinary-storage.provider';
import { config } from '../shared/config/config';
const getStorageProvider = () => { const getStorageProvider = () => {
if (process.env.FILE_DRIVER === 'cloudinary') { if (config.fileDriver === 'cloudinary') {
return new CloudinaryStorageProvider(); return new CloudinaryStorageProvider();
} }
return new LocalStorageProvider(); return new LocalStorageProvider();
+1 -1
View File
@@ -25,7 +25,7 @@ for (const varName of requiredEnv) {
export const config = { export const config = {
betterAuthSecret: process.env.BETTER_AUTH_SECRET!, betterAuthSecret: process.env.BETTER_AUTH_SECRET!,
betterAuthUrl: process.env.BETTER_AUTH_URL!, betterAuthUrl: process.env.BETTER_AUTH_URL!,
trustedOrigins: process.env.TRUSTED_ORIGINS!.split(','), trustedOrigins: process.env.TRUSTED_ORIGINS!.split(',').map(origin => origin.trim()).filter(origin => origin.length > 0),
googleClientId: process.env.GOOGLE_CLIENT_ID!, googleClientId: process.env.GOOGLE_CLIENT_ID!,
googleClientSecret: process.env.GOOGLE_CLIENT_SECRET!, googleClientSecret: process.env.GOOGLE_CLIENT_SECRET!,
fileDriver: process.env.FILE_DRIVER, fileDriver: process.env.FILE_DRIVER,