Skip to main content

Configuration Guide

After installation, configure FSS to match your project requirements.

Project Structure Configuration

Directory Structure

fss/
├── projects/
│ ├── fss/
│ │ ├── backend/ # NestJS backend
│ │ ├── frontend/ # Next.js frontend
│ │ └── mobile/ # React Native mobile
│ │
├── docs/ # Documentation
├── scripts/ # Utility scripts
└── docker-compose.yml # Docker configuration

Backend Configuration

NestJS Configuration

// projects/fss/backend/src/app.module.ts
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { AuthModule } from './modules/auth/auth.module';
import { UserModule } from './modules/user/user.module';
import { AdminModule } from './modules/admin/admin.module';

@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: '.env',
}),
AuthModule,
UserModule,
AdminModule,
],
})
export class AppModule {}

CORS Configuration

// projects/fss/backend/src/main.ts
import { NestFactory } from '@nestjs/core';
import { AppModule } from './app.module';

async function bootstrap() {
const app = await NestFactory.create(AppModule);

app.enableCors({
origin: process.env.CORS_ORIGIN || 'http://localhost:3000',
methods: 'GET,HEAD,PUT,PATCH,POST,DELETE',
credentials: true,
});

await app.listen(process.env.PORT || 3443);
}
bootstrap();

Frontend Configuration

Next.js Configuration

// projects/fss/frontend/next.config.js
/** @type {import('next').NextConfig} */
const nextConfig = {
reactStrictMode: true,
swcMinify: true,

images: {
domains: ['localhost', 'your-domain.com'],
},

async rewrites() {
return [
{
source: '/api/:path*',
destination: `${process.env.NEXT_PUBLIC_API_URL}/:path*`,
},
];
},
};

module.exports = nextConfig;

Environment Variables

# projects/fss/frontend/.env.local
NEXT_PUBLIC_API_URL=https://localhost:3443
NEXT_PUBLIC_APP_URL=http://localhost:3000
NEXT_PUBLIC_ENABLE_MFA=true
NEXT_PUBLIC_ENABLE_RECAPTCHA=true

Mobile Configuration

Expo Configuration

// projects/fss/mobile/app.json
{
"expo": {
"name": "FSS Mobile",
"slug": "fss-mobile",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./src/assets/icon.png",
"userInterfaceStyle": "light",
"splash": {
"image": "./src/assets/splash.png",
"resizeMode": "contain",
"backgroundColor": "#ffffff"
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com.yourcompany.fssmobile"
},
"android": {
"adaptiveIcon": {
"foregroundImage": "./src/assets/adaptive-icon.png",
"backgroundColor": "#ffffff"
},
"package": "com.yourcompany.fssmobile"
},
"web": {
"favicon": "./src/assets/favicon.png"
}
}
}

Database Configuration

Prisma Schema

// projects/fss/backend/prisma/schema.prisma
generator client {
provider = "prisma-client-js"
}

datasource db {
provider = "postgresql"
url = env("DATABASE_URL")
}

model User {
id String @id @default(uuid())
email String @unique
name String?
password String
role Role @default(USER)
createdAt DateTime @default(now())
updatedAt DateTime @updatedAt
}

enum Role {
USER
ADMIN
}

Authentication Configuration

JWT Configuration

// projects/fss/backend/src/modules/auth/config/jwt.config.ts
import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';

@Injectable()
export class JwtConfig {
constructor(private configService: ConfigService) {}

get secret() {
return this.configService.get<string>('JWT_SECRET');
}

get expiresIn() {
return this.configService.get<string>('JWT_EXPIRES_IN') || '15m';
}

get refreshSecret() {
return this.configService.get<string>('JWT_REFRESH_SECRET');
}

get refreshExpiresIn() {
return this.configService.get<string>('JWT_REFRESH_EXPIRES_IN') || '7d';
}
}

Next Steps