feat: Add authentication, file management with Cloudinary support, and Prisma-integrated file cleanup.
This commit is contained in:
+4
-3
@@ -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,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -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 {
|
||||||
|
|||||||
@@ -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();
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
Reference in New Issue
Block a user