feat: configured database and user entity

This commit is contained in:
2026-07-19 03:04:18 +03:30
parent d230040985
commit 95e3a91eea
13 changed files with 519 additions and 3 deletions
+14 -1
View File
@@ -1,9 +1,22 @@
import { Module } from '@nestjs/common';
import { AppController } from './app.controller';
import { AppService } from './app.service';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ConfigModule, ConfigService } from '@nestjs/config';
import Joi from 'joi';
import { validationSchema } from './config/config.validation';
import { UsersModule } from './users/users.module';
import { databaseConfig } from './config/typeorm.config';
@Module({
imports: [],
imports: [
ConfigModule.forRoot({
isGlobal: true,
validationSchema
}),
TypeOrmModule.forRootAsync(databaseConfig()),
UsersModule
],
controllers: [AppController],
providers: [AppService],
})
+16
View File
@@ -0,0 +1,16 @@
import {
CreateDateColumn,
PrimaryGeneratedColumn,
UpdateDateColumn,
} from 'typeorm';
export abstract class BaseEntity {
@PrimaryGeneratedColumn('uuid')
id: string;
@CreateDateColumn({type: 'timestamptz'})
createdAt: Date;
@UpdateDateColumn({type: 'timestamptz'})
updatedAt: Date;
}
+9
View File
@@ -0,0 +1,9 @@
import * as Joi from 'joi';
export const validationSchema = Joi.object({
DB_HOST: Joi.string().required(),
DB_PORT: Joi.number().required(),
DB_USER: Joi.string().required(),
DB_PASSWORD: Joi.string().required(),
DB_NAME: Joi.string().required(),
});
+21
View File
@@ -0,0 +1,21 @@
import { ConfigService } from '@nestjs/config';
import { TypeOrmModuleAsyncOptions } from '@nestjs/typeorm';
export function databaseConfig(): TypeOrmModuleAsyncOptions {
return {
inject: [ConfigService],
useFactory: (config: ConfigService) => ({
type: 'postgres',
host: config.getOrThrow<string>('DB_HOST'),
port: config.getOrThrow<number>('DB_PORT'),
username: config.getOrThrow<string>('DB_USER'),
password: config.getOrThrow<string>('DB_PASSWORD'),
database: config.getOrThrow<string>('DB_NAME'),
synchronize: true,
autoLoadEntities: true,
logging: true,
}),
};
}
@@ -0,0 +1,6 @@
import { Controller } from '@nestjs/common';
@Controller('users')
export class UsersController {
}
+29
View File
@@ -0,0 +1,29 @@
import { Entity, Column } from "typeorm";
import { BaseEntity } from "src/common/entities/base.entity";
@Entity('users')
export class User extends BaseEntity {
@Column({type: 'varchar', length: 20})
firstName: string;
@Column({type: 'varchar', length: 20})
lastName: string;
@Column({unique: true, type: 'varchar', length: 100})
email: string;
@Column({unique: true, type: 'varchar', length: 11})
phone: string;
@Column({
select: false
})
password: string;
@Column({
name: 'refresh_token',
nullable: true,
select: false
})
refreshToken: string;
}
+9
View File
@@ -0,0 +1,9 @@
import { Injectable } from '@nestjs/common';
import { UserRepository } from '../repositories/user.repository';
@Injectable()
export class UsersService {
constructor(
private readonly userRepository: UserRepository
) {}
}
+11
View File
@@ -0,0 +1,11 @@
import { Repository } from "typeorm";
import { User } from "../entities/user.entity";
import { InjectRepository } from "@nestjs/typeorm";
import { Injectable } from "@nestjs/common";
@Injectable()
export class UserRepository extends Repository<User> {
constructor(@InjectRepository(User) userRepository: Repository<User>) {
super(userRepository.target, userRepository.manager, userRepository.queryRunner);
}
}
+16
View File
@@ -0,0 +1,16 @@
import { Module } from '@nestjs/common';
import { UsersController } from './controllers/users.controller';
import { UsersService } from './providers/users.service';
import { UserRepository } from './repositories/user.repository';
import { TypeOrmModule } from '@nestjs/typeorm';
import { User } from './entities/user.entity';
@Module({
imports: [
TypeOrmModule.forFeature([User])
],
controllers: [UsersController],
providers: [UsersService, UserRepository],
exports: [UsersService]
})
export class UsersModule {}