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 { applyFileCleanup } from '../prisma/file-cleanup.helper';
import { config } from '../shared/config/config';
const prisma = new PrismaClient();
applyFileCleanup(prisma);
@@ -27,12 +28,12 @@ export const auth = betterAuth({
sendOnSignIn: true,
autoSignInAfterVerification: true,
},
trustedOrigins: ['http://localhost:5173', 'http://localhost:5174'],
trustedOrigins: config.trustedOrigins,
socialProviders: {
google: {
prompt: 'select_account',
clientId: process.env.GOOGLE_CLIENT_ID!,
clientSecret: process.env.GOOGLE_CLIENT_SECRET!,
clientId: config.googleClientId,
clientSecret: config.googleClientSecret,
},
},
});
+2 -1
View File
@@ -5,6 +5,7 @@ import { FileController } from './file.controller';
import { PrismaService } from 'src/prisma/prisma.service';
import { LocalStorageProvider } from './storage-providers/local-storage.provider';
import { CloudinaryStorageProvider } from './storage-providers/cloudinary-storage.provider';
import { config } from '../shared/config/config';
@Module({
controllers: [FileController],
@@ -14,7 +15,7 @@ import { CloudinaryStorageProvider } from './storage-providers/cloudinary-storag
{
provide: 'StorageProvider',
useFactory: () => {
switch (process.env.FILE_DRIVER) {
switch (config.fileDriver) {
case 'cloudinary':
return new CloudinaryStorageProvider();
default:
@@ -1,11 +1,12 @@
// src/file/storage-providers/cloudinary-storage.provider.ts
import { IStorageProvider } from './storage-provider.interface';
import { v2 as cloudinary } from 'cloudinary';
import { config } from '../../shared/config/config';
cloudinary.config({
cloud_name: process.env.CLOUDINARY_CLOUD_NAME,
api_key: process.env.CLOUDINARY_API_KEY,
api_secret: process.env.CLOUDINARY_API_SECRET,
cloud_name: config.cloudinary.cloudName,
api_key: config.cloudinary.apiKey,
api_secret: config.cloudinary.apiSecret,
});
export class CloudinaryStorageProvider implements IStorageProvider {
+2 -1
View File
@@ -1,9 +1,10 @@
import { PrismaClient } from '@prisma/client';
import { LocalStorageProvider } from '../file/storage-providers/local-storage.provider';
import { CloudinaryStorageProvider } from '../file/storage-providers/cloudinary-storage.provider';
import { config } from '../shared/config/config';
const getStorageProvider = () => {
if (process.env.FILE_DRIVER === 'cloudinary') {
if (config.fileDriver === 'cloudinary') {
return new CloudinaryStorageProvider();
}
return new LocalStorageProvider();
+1 -1
View File
@@ -25,7 +25,7 @@ for (const varName of requiredEnv) {
export const config = {
betterAuthSecret: process.env.BETTER_AUTH_SECRET!,
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!,
googleClientSecret: process.env.GOOGLE_CLIENT_SECRET!,
fileDriver: process.env.FILE_DRIVER,