Refactor code structure for improved readability and maintainability

This commit is contained in:
Boris D
2025-09-09 13:28:39 +03:00
parent 5572bf48b7
commit afb1f343e0
23 changed files with 4239 additions and 0 deletions

31
src/app/app.module.ts Normal file
View File

@ -0,0 +1,31 @@
import { Module } from "@nestjs/common";
import { TypeOrmModule } from "@nestjs/typeorm";
import { ConfigModule } from "@nestjs/config";
import { User } from "../entities/user.entity";
import { UserService } from "../services/user.service";
@Module({
imports: [
ConfigModule.forRoot({
isGlobal: true,
envFilePath: ".env",
}),
TypeOrmModule.forRoot({
type: "mariadb",
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT) || 3306,
username: process.env.DB_USERNAME || "root",
password: process.env.DB_PASSWORD || "",
database: process.env.DB_DATABASE || "low_code_engine",
entities: [__dirname + "/../**/*.entity{.ts,.js}"],
migrations: [__dirname + "/../migrations/*{.ts,.js}"],
synchronize: process.env.NODE_ENV === "development",
migrationsRun: process.env.NODE_ENV === "production",
autoLoadEntities: true,
}),
TypeOrmModule.forFeature([User]),
],
controllers: [],
providers: [UserService],
})
export class AppModule {}

18
src/data-source.ts Normal file
View File

@ -0,0 +1,18 @@
import { DataSource } from "typeorm";
import { config } from "dotenv";
// Load environment variables
config();
export default new DataSource({
type: "mariadb",
host: process.env.DB_HOST || "localhost",
port: parseInt(process.env.DB_PORT) || 3306,
username: process.env.DB_USERNAME || "root",
password: process.env.DB_PASSWORD || "",
database: process.env.DB_DATABASE || "low_code_engine",
entities: ["src/**/*.entity{.ts,.js}"],
migrations: ["src/migrations/*{.ts,.js}"],
synchronize: false,
logging: false,
});

View File

@ -0,0 +1,31 @@
import {
Entity,
PrimaryGeneratedColumn,
Column,
CreateDateColumn,
UpdateDateColumn,
} from "typeorm";
@Entity("users")
export class User {
@PrimaryGeneratedColumn()
id: number;
@Column({ unique: true })
email: string;
@Column()
firstName: string;
@Column()
lastName: string;
@Column({ default: true })
isActive: boolean;
@CreateDateColumn()
createdAt: Date;
@UpdateDateColumn()
updatedAt: Date;
}

9
src/main.ts Normal file
View File

@ -0,0 +1,9 @@
import { NestFactory } from "@nestjs/core";
import { AppModule } from "./app/app.module";
async function bootstrap() {
const app = await NestFactory.create(AppModule);
await app.listen(3000);
}
bootstrap();

View File

@ -0,0 +1,15 @@
import { MigrationInterface, QueryRunner } from "typeorm";
export class Init1757413588655 implements MigrationInterface {
name = 'Init1757413588655'
public async up(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`CREATE TABLE \`users\` (\`id\` int NOT NULL AUTO_INCREMENT, \`email\` varchar(255) NOT NULL, \`firstName\` varchar(255) NOT NULL, \`lastName\` varchar(255) NOT NULL, \`isActive\` tinyint NOT NULL DEFAULT 1, \`createdAt\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6), \`updatedAt\` datetime(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6) ON UPDATE CURRENT_TIMESTAMP(6), UNIQUE INDEX \`IDX_97672ac88f789774dd47f7c8be\` (\`email\`), PRIMARY KEY (\`id\`)) ENGINE=InnoDB`);
}
public async down(queryRunner: QueryRunner): Promise<void> {
await queryRunner.query(`DROP INDEX \`IDX_97672ac88f789774dd47f7c8be\` ON \`users\``);
await queryRunner.query(`DROP TABLE \`users\``);
}
}

View File

@ -0,0 +1,34 @@
import { Injectable } from "@nestjs/common";
import { InjectRepository } from "@nestjs/typeorm";
import { Repository } from "typeorm";
import { User } from "../entities/user.entity";
@Injectable()
export class UserService {
constructor(
@InjectRepository(User)
private userRepository: Repository<User>
) {}
async findAll(): Promise<User[]> {
return this.userRepository.find();
}
async findOne(id: number): Promise<User> {
return this.userRepository.findOne({ where: { id } });
}
async create(userData: Partial<User>): Promise<User> {
const user = this.userRepository.create(userData);
return this.userRepository.save(user);
}
async update(id: number, userData: Partial<User>): Promise<User> {
await this.userRepository.update(id, userData);
return this.findOne(id);
}
async remove(id: number): Promise<void> {
await this.userRepository.delete(id);
}
}