From 35d771bff0fe16ef946314d39f47d6e8c8d3e3d2 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Fri, 24 Nov 2023 11:06:55 +0300 Subject: [PATCH 01/23] start create entity for proxy --- backend/libs/database/proxy_user.entity.ts | 31 +++++++++++++++++++ .../libs/database/proxy_user_table.entity.ts | 31 +++++++++++++++++++ 2 files changed, 62 insertions(+) create mode 100644 backend/libs/database/proxy_user.entity.ts create mode 100644 backend/libs/database/proxy_user_table.entity.ts diff --git a/backend/libs/database/proxy_user.entity.ts b/backend/libs/database/proxy_user.entity.ts new file mode 100644 index 0000000..d89415a --- /dev/null +++ b/backend/libs/database/proxy_user.entity.ts @@ -0,0 +1,31 @@ +import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { User } from './user.entity'; + +@Entity() +export class ProxyUser { + constructor(props?: Partial) { + Object.assign(this, props); + } + + @PrimaryGeneratedColumn('uuid') + public uuid!: string; + + @Column({ nullable: true }) + public userName: string; + + @Column({ nullable: true }) + public description: string; + + @Column({ nullable: false }) + public link!: string; + + @Column({ nullable: false, type: 'timestamptz' }) + public connectDate!: Date; + + @Column({ nullable: true }) + public user_id!: string; + + @OneToOne(() => User, (user) => user.id, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: true }) + @JoinColumn({ name: 'user_id' }) + public user: User; +} diff --git a/backend/libs/database/proxy_user_table.entity.ts b/backend/libs/database/proxy_user_table.entity.ts new file mode 100644 index 0000000..afb6d52 --- /dev/null +++ b/backend/libs/database/proxy_user_table.entity.ts @@ -0,0 +1,31 @@ +import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { User } from './user.entity'; + +@Entity() +export class Admin { + constructor(props?: Partial) { + Object.assign(this, props); + } + + @PrimaryGeneratedColumn('uuid') + public uuid!: string; + + @Column({ nullable: true }) + public userName: string; + + @Column({ nullable: true }) + public description: string; + + @Column({ nullable: false }) + public link!: string; + + @Column({ nullable: false, type: 'timestamptz' }) + public connectDate!: Date; + + @Column({ nullable: true }) + public user_id!: string; + + @OneToOne(() => User, (user) => user.id, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: true }) + @JoinColumn({ name: 'user_id' }) + public user: User; +} From f42741a481effdd4cf534953c35772034934af80 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Fri, 24 Nov 2023 17:14:11 +0300 Subject: [PATCH 02/23] This commit adds the `Payment` and `ProxyUser` entities to the database. --- backend/libs/database/ProxyUser.entity.ts | 31 +++++++++++++++++++++++ backend/libs/database/payment.entity.ts | 22 ++++++++++++++++ backend/libs/database/post.entity.ts | 2 +- backend/libs/libs.module.ts | 4 ++- 4 files changed, 57 insertions(+), 2 deletions(-) create mode 100644 backend/libs/database/ProxyUser.entity.ts create mode 100644 backend/libs/database/payment.entity.ts diff --git a/backend/libs/database/ProxyUser.entity.ts b/backend/libs/database/ProxyUser.entity.ts new file mode 100644 index 0000000..27a2d34 --- /dev/null +++ b/backend/libs/database/ProxyUser.entity.ts @@ -0,0 +1,31 @@ +import { Entity, OneToOne, JoinColumn, PrimaryGeneratedColumn, Column } from 'typeorm'; +import { User } from './user.entity'; + +@Entity() +export class ProxyUser { + constructor(props?: Partial) { + Object.assign(this, props); + } + + @PrimaryGeneratedColumn('uuid') + public id!: string; + + @Column({ nullable: true }) + public userName: string; + + @Column({ nullable: true }) + public description: string; + + @Column({ nullable: false }) + public link!: string; + + @Column({ nullable: false, type: 'timestamptz' }) + public connectDate!: Date; + + @Column({ nullable: true }) + user_id: string; + + @OneToOne(() => User) + @JoinColumn({ name: 'user_id' }) + user: User; +} diff --git a/backend/libs/database/payment.entity.ts b/backend/libs/database/payment.entity.ts new file mode 100644 index 0000000..3e77782 --- /dev/null +++ b/backend/libs/database/payment.entity.ts @@ -0,0 +1,22 @@ +import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; +import { ProxyUser } from './ProxyUser.entity'; + +@Entity() +export class Payment { + @PrimaryGeneratedColumn('uuid') + public id!: string; + + @Column() + public uuidUser!: string; + + @Column({ type: 'timestamptz' }) + public payTime!: Date; + + @ManyToOne(() => ProxyUser, { onDelete: 'CASCADE' }) // Assuming you want to cascade delete when a user is deleted + @JoinColumn({ name: 'uuidUser' }) + user: ProxyUser; + + constructor(props?: Partial) { + Object.assign(this, props); + } +} diff --git a/backend/libs/database/post.entity.ts b/backend/libs/database/post.entity.ts index f58ce0b..4ff2e89 100644 --- a/backend/libs/database/post.entity.ts +++ b/backend/libs/database/post.entity.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, Column, Timestamp, OneToOne, JoinColumn } from 'typeorm'; +import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm'; import { Admin } from './admin.entity'; @Entity() export class Post { diff --git a/backend/libs/libs.module.ts b/backend/libs/libs.module.ts index ef53738..57dc7e7 100644 --- a/backend/libs/libs.module.ts +++ b/backend/libs/libs.module.ts @@ -4,8 +4,10 @@ import { User } from './database/user.entity'; import { Admin } from './database/admin.entity'; import { Post } from './database/post.entity'; import { Image } from './database/image.entity'; +import { Payment } from './database/payment.entity'; +import { ProxyUser } from './database/ProxyUser.entity'; @Module({ - imports: [TypeOrmModule.forFeature([User, Admin, Post, Image])], + imports: [TypeOrmModule.forFeature([User, Admin, Post, Image, Payment, ProxyUser])], exports: [TypeOrmModule], }) export class LibsModule {} From e70880dcc5d95f892d50b4490b73dc4b8afd3390 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Fri, 24 Nov 2023 17:15:52 +0300 Subject: [PATCH 03/23] idk what --- backend/libs/database/ProxyUser.entity.ts | 31 ------------------- backend/libs/database/payment.entity.ts | 2 +- .../libs/database/proxy_user_table.entity.ts | 31 ------------------- backend/libs/libs.module.ts | 2 +- 4 files changed, 2 insertions(+), 64 deletions(-) delete mode 100644 backend/libs/database/ProxyUser.entity.ts delete mode 100644 backend/libs/database/proxy_user_table.entity.ts diff --git a/backend/libs/database/ProxyUser.entity.ts b/backend/libs/database/ProxyUser.entity.ts deleted file mode 100644 index 27a2d34..0000000 --- a/backend/libs/database/ProxyUser.entity.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Entity, OneToOne, JoinColumn, PrimaryGeneratedColumn, Column } from 'typeorm'; -import { User } from './user.entity'; - -@Entity() -export class ProxyUser { - constructor(props?: Partial) { - Object.assign(this, props); - } - - @PrimaryGeneratedColumn('uuid') - public id!: string; - - @Column({ nullable: true }) - public userName: string; - - @Column({ nullable: true }) - public description: string; - - @Column({ nullable: false }) - public link!: string; - - @Column({ nullable: false, type: 'timestamptz' }) - public connectDate!: Date; - - @Column({ nullable: true }) - user_id: string; - - @OneToOne(() => User) - @JoinColumn({ name: 'user_id' }) - user: User; -} diff --git a/backend/libs/database/payment.entity.ts b/backend/libs/database/payment.entity.ts index 3e77782..3262fce 100644 --- a/backend/libs/database/payment.entity.ts +++ b/backend/libs/database/payment.entity.ts @@ -1,5 +1,5 @@ import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; -import { ProxyUser } from './ProxyUser.entity'; +import { ProxyUser } from './proxy_user.entity'; @Entity() export class Payment { diff --git a/backend/libs/database/proxy_user_table.entity.ts b/backend/libs/database/proxy_user_table.entity.ts deleted file mode 100644 index afb6d52..0000000 --- a/backend/libs/database/proxy_user_table.entity.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; -import { User } from './user.entity'; - -@Entity() -export class Admin { - constructor(props?: Partial) { - Object.assign(this, props); - } - - @PrimaryGeneratedColumn('uuid') - public uuid!: string; - - @Column({ nullable: true }) - public userName: string; - - @Column({ nullable: true }) - public description: string; - - @Column({ nullable: false }) - public link!: string; - - @Column({ nullable: false, type: 'timestamptz' }) - public connectDate!: Date; - - @Column({ nullable: true }) - public user_id!: string; - - @OneToOne(() => User, (user) => user.id, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: true }) - @JoinColumn({ name: 'user_id' }) - public user: User; -} diff --git a/backend/libs/libs.module.ts b/backend/libs/libs.module.ts index 57dc7e7..f369309 100644 --- a/backend/libs/libs.module.ts +++ b/backend/libs/libs.module.ts @@ -5,7 +5,7 @@ import { Admin } from './database/admin.entity'; import { Post } from './database/post.entity'; import { Image } from './database/image.entity'; import { Payment } from './database/payment.entity'; -import { ProxyUser } from './database/ProxyUser.entity'; +import { ProxyUser } from './database/proxy_user.entity'; @Module({ imports: [TypeOrmModule.forFeature([User, Admin, Post, Image, Payment, ProxyUser])], exports: [TypeOrmModule], From 04aefa8af730d173229957dba9a4b48153a515dc Mon Sep 17 00:00:00 2001 From: Errormacr Date: Fri, 24 Nov 2023 17:17:32 +0300 Subject: [PATCH 04/23] Changed the primary key of the Payment entity from a UUID to an incrementing integer. --- backend/libs/database/payment.entity.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/backend/libs/database/payment.entity.ts b/backend/libs/database/payment.entity.ts index 3262fce..14e7844 100644 --- a/backend/libs/database/payment.entity.ts +++ b/backend/libs/database/payment.entity.ts @@ -3,8 +3,8 @@ import { ProxyUser } from './proxy_user.entity'; @Entity() export class Payment { - @PrimaryGeneratedColumn('uuid') - public id!: string; + @PrimaryGeneratedColumn('increment') + public id!: number; @Column() public uuidUser!: string; From 0b471ee5de6f5032e898f5290b745b2178df34fe Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Fri, 24 Nov 2023 17:53:25 +0300 Subject: [PATCH 05/23] Some changes in entities --- backend/libs/database/payment.entity.ts | 16 ++++++++-------- backend/libs/database/post.entity.ts | 5 ++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/backend/libs/database/payment.entity.ts b/backend/libs/database/payment.entity.ts index 14e7844..71f68a0 100644 --- a/backend/libs/database/payment.entity.ts +++ b/backend/libs/database/payment.entity.ts @@ -1,22 +1,22 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn } from 'typeorm'; +import { Column, Entity, JoinColumn, ManyToOne, PrimaryGeneratedColumn } from 'typeorm'; import { ProxyUser } from './proxy_user.entity'; @Entity() export class Payment { + constructor(props?: Partial) { + Object.assign(this, props); + } + @PrimaryGeneratedColumn('increment') public id!: number; @Column() - public uuidUser!: string; + public user_uuid!: string; @Column({ type: 'timestamptz' }) public payTime!: Date; - @ManyToOne(() => ProxyUser, { onDelete: 'CASCADE' }) // Assuming you want to cascade delete when a user is deleted - @JoinColumn({ name: 'uuidUser' }) + @ManyToOne(() => ProxyUser, { onDelete: 'CASCADE' }) + @JoinColumn({ name: 'user_uuid' }) user: ProxyUser; - - constructor(props?: Partial) { - Object.assign(this, props); - } } diff --git a/backend/libs/database/post.entity.ts b/backend/libs/database/post.entity.ts index 4ff2e89..1bebb15 100644 --- a/backend/libs/database/post.entity.ts +++ b/backend/libs/database/post.entity.ts @@ -1,4 +1,4 @@ -import { Entity, PrimaryGeneratedColumn, Column, OneToOne, JoinColumn } from 'typeorm'; +import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; import { Admin } from './admin.entity'; @Entity() export class Post { @@ -14,10 +14,13 @@ export class Post { @Column({ nullable: false }) from_user_id: string; + @Column() text: string; + @Column() media_group_id: string; + @Column({ type: 'timestamptz' }) timestamps: Date; From 2c0ff4b058ed7f3f48cfeb1daed3f886e59d6254 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Fri, 24 Nov 2023 17:55:54 +0300 Subject: [PATCH 06/23] Updated bot --- neuro-reply-bot-reworked | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neuro-reply-bot-reworked b/neuro-reply-bot-reworked index d286da6..8c2d706 160000 --- a/neuro-reply-bot-reworked +++ b/neuro-reply-bot-reworked @@ -1 +1 @@ -Subproject commit d286da698e06a5bfa57131327db10d1fc716eea5 +Subproject commit 8c2d706401670443ce7813140c72feaa1d65c04c From 504ca91b94fba42065c8296eda7d7f5324aebede Mon Sep 17 00:00:00 2001 From: Errormacr Date: Sat, 25 Nov 2023 18:29:29 +0300 Subject: [PATCH 07/23] Begin on devops --- backend/.dockerignore | 2 ++ backend/dockerfile | 8 ++++++++ docker-compose.yml | 16 ++++++++++++++++ 3 files changed, 26 insertions(+) create mode 100644 backend/.dockerignore create mode 100644 backend/dockerfile diff --git a/backend/.dockerignore b/backend/.dockerignore new file mode 100644 index 0000000..e9c2afc --- /dev/null +++ b/backend/.dockerignore @@ -0,0 +1,2 @@ +node_modules +dockerfile \ No newline at end of file diff --git a/backend/dockerfile b/backend/dockerfile new file mode 100644 index 0000000..0f2cca2 --- /dev/null +++ b/backend/dockerfile @@ -0,0 +1,8 @@ +FROM node:lts-alpine +WORKDIR /app +RUN corepack enable && corepack prepare pnpm@latest --activate +COPY package.json pnpm-*.yaml ./ +RUN pnpm install --frozen-lockfile +COPY . . +EXPOSE 3000 +CMD [ "pnpm", "start" ] \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index 6da560a..6a2b2f6 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -16,6 +16,22 @@ services: volumes: - neuro_postgres_db:/var/lib/postgresql/data restart: always + backend: + container_name: neuro_front + build: ./backend + stdin_open: true + networks: + - labnet + volumes: + - ./backend:/app + - /app/node_modules + ports: + - 3000:3000 + depends_on: + - db + volumes: neuro_postgres_db: driver: local +networks: + labnet: \ No newline at end of file From da93e2a4b25267fe62b75092c401379fb56f6f62 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Sat, 25 Nov 2023 18:59:13 +0300 Subject: [PATCH 08/23] fix some problem, can't connect --- backend/config/index.ts | 2 +- docker-compose.yml | 12 ++++++++++-- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/backend/config/index.ts b/backend/config/index.ts index c359859..6f037ce 100644 --- a/backend/config/index.ts +++ b/backend/config/index.ts @@ -8,7 +8,7 @@ export const config = { host: process.env.DATABASE_HOST || 'localhost', port: +process.env.DATABASE_PORT || 5432, username: process.env.DATABASE_USERNAME || 'postgres', - password: process.env.DATABASE_PASSWORD || '', + password: process.env.DATABASE_PASSWORD || 'postgres', database: process.env.DATABASE_DB || 'bot_db', synchronize: true, logging: false, diff --git a/docker-compose.yml b/docker-compose.yml index 6a2b2f6..af57012 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -13,13 +13,21 @@ services: - "${DATABASE_PORT}:5432" env_file: - .env + networks: + - labnet volumes: - neuro_postgres_db:/var/lib/postgresql/data restart: always backend: - container_name: neuro_front + container_name: neuro_backend build: ./backend stdin_open: true + environment: + - DATABASE_HOST='db' + - DATABASE_PORT=${DATABASE_PORT} + - DATABASE_USERNAME=${DATABASE_USER} + - DATABASE_PASSWORD=${DATABASE_PASSWORD} + - DATABASE_DB=${DATABASE_NAME} networks: - labnet volumes: @@ -34,4 +42,4 @@ volumes: neuro_postgres_db: driver: local networks: - labnet: \ No newline at end of file + labnet: {} \ No newline at end of file From 4bac3071092b776cdb8aba9e44d66e7751bfca91 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Sat, 25 Nov 2023 19:06:59 +0300 Subject: [PATCH 09/23] Update database password to an empty string --- backend/config/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/config/index.ts b/backend/config/index.ts index 6f037ce..c359859 100644 --- a/backend/config/index.ts +++ b/backend/config/index.ts @@ -8,7 +8,7 @@ export const config = { host: process.env.DATABASE_HOST || 'localhost', port: +process.env.DATABASE_PORT || 5432, username: process.env.DATABASE_USERNAME || 'postgres', - password: process.env.DATABASE_PASSWORD || 'postgres', + password: process.env.DATABASE_PASSWORD || '', database: process.env.DATABASE_DB || 'bot_db', synchronize: true, logging: false, From f8d805d18e1078c570b3e5cf5364bdeaf7780592 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Sat, 25 Nov 2023 19:49:52 +0300 Subject: [PATCH 10/23] Prepare for merge with dev. FIxed docker configs --- backend/{dockerfile => Dockerfile} | 3 ++- backend/package.json | 2 +- docker-compose.yml | 17 +++++++---------- 3 files changed, 10 insertions(+), 12 deletions(-) rename backend/{dockerfile => Dockerfile} (81%) diff --git a/backend/dockerfile b/backend/Dockerfile similarity index 81% rename from backend/dockerfile rename to backend/Dockerfile index 0f2cca2..3e9ce51 100644 --- a/backend/dockerfile +++ b/backend/Dockerfile @@ -4,5 +4,6 @@ RUN corepack enable && corepack prepare pnpm@latest --activate COPY package.json pnpm-*.yaml ./ RUN pnpm install --frozen-lockfile COPY . . +RUN pnpm build EXPOSE 3000 -CMD [ "pnpm", "start" ] \ No newline at end of file +CMD [ "pnpm", "start:prod" ] \ No newline at end of file diff --git a/backend/package.json b/backend/package.json index c348abc..7e661ba 100644 --- a/backend/package.json +++ b/backend/package.json @@ -11,7 +11,7 @@ "start": "nest start", "start:dev": "nest start --watch", "start:debug": "nest start --debug --watch", - "start:prod": "node dist/main", + "start:prod": "node dist/src/main", "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", "test": "jest", "test:watch": "jest --watch", diff --git a/docker-compose.yml b/docker-compose.yml index af57012..a334e03 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -18,28 +18,25 @@ services: volumes: - neuro_postgres_db:/var/lib/postgresql/data restart: always + backend: container_name: neuro_backend build: ./backend - stdin_open: true environment: - - DATABASE_HOST='db' - - DATABASE_PORT=${DATABASE_PORT} - - DATABASE_USERNAME=${DATABASE_USER} - - DATABASE_PASSWORD=${DATABASE_PASSWORD} - - DATABASE_DB=${DATABASE_NAME} + - DATABASE_PORT=5432 + - DATABASE_HOST=db + env_file: + - .env networks: - labnet - volumes: - - ./backend:/app - - /app/node_modules ports: - 3000:3000 depends_on: - db + restart: always volumes: neuro_postgres_db: driver: local networks: - labnet: {} \ No newline at end of file + labnet: From 652e8c502edd7921456a5c95d7e9441eaf2c91bf Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Sun, 26 Nov 2023 15:17:55 +0300 Subject: [PATCH 11/23] added: proxy module --- backend/libs/database/proxy_user.entity.ts | 14 ++- backend/src/app.module.ts | 11 +- backend/src/modules/proxy/proxy.controller.ts | 46 ++++++++ backend/src/modules/proxy/proxy.dto.ts | 12 ++ backend/src/modules/proxy/proxy.module.ts | 11 ++ backend/src/modules/proxy/proxy.service.ts | 105 ++++++++++++++++++ 6 files changed, 193 insertions(+), 6 deletions(-) create mode 100644 backend/src/modules/proxy/proxy.controller.ts create mode 100644 backend/src/modules/proxy/proxy.dto.ts create mode 100644 backend/src/modules/proxy/proxy.module.ts create mode 100644 backend/src/modules/proxy/proxy.service.ts diff --git a/backend/libs/database/proxy_user.entity.ts b/backend/libs/database/proxy_user.entity.ts index d89415a..95f50ab 100644 --- a/backend/libs/database/proxy_user.entity.ts +++ b/backend/libs/database/proxy_user.entity.ts @@ -1,4 +1,5 @@ -import { Column, Entity, JoinColumn, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Column, Entity, JoinColumn, OneToMany, OneToOne, PrimaryGeneratedColumn } from 'typeorm'; +import { Payment } from './payment.entity'; import { User } from './user.entity'; @Entity() @@ -10,11 +11,11 @@ export class ProxyUser { @PrimaryGeneratedColumn('uuid') public uuid!: string; - @Column({ nullable: true }) - public userName: string; + @Column({ nullable: false, unique: true }) + public userName!: string; @Column({ nullable: true }) - public description: string; + public description?: string; @Column({ nullable: false }) public link!: string; @@ -27,5 +28,8 @@ export class ProxyUser { @OneToOne(() => User, (user) => user.id, { onDelete: 'CASCADE', onUpdate: 'CASCADE', nullable: true }) @JoinColumn({ name: 'user_id' }) - public user: User; + public user?: User; + + @OneToMany(() => Payment, (payment) => payment.user) + public payments: Payment[]; } diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 65d3643..1adba1e 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -6,10 +6,19 @@ import { AdminModule } from './modules/admin/admin.module'; import { ImageModule } from './modules/image/image.module'; import { AppInitService } from './modules/initialization/app.init.service'; import { PostModule } from './modules/post/post.module'; +import { ProxyModule } from './modules/proxy/proxy.module'; import { UserModule } from './modules/user/user.module'; @Module({ - imports: [LibsModule, PostModule, AdminModule, UserModule, ImageModule, TypeOrmModule.forRoot(config.database)], + imports: [ + LibsModule, + PostModule, + AdminModule, + UserModule, + ImageModule, + ProxyModule, + TypeOrmModule.forRoot(config.database), + ], controllers: [], providers: [AppInitService], }) diff --git a/backend/src/modules/proxy/proxy.controller.ts b/backend/src/modules/proxy/proxy.controller.ts new file mode 100644 index 0000000..87e565e --- /dev/null +++ b/backend/src/modules/proxy/proxy.controller.ts @@ -0,0 +1,46 @@ +import { Body, Controller, Get, Param, Post } from '@nestjs/common'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; +import { IOperation, IProxyUser } from './proxy.dto'; +import { ProxyService } from './proxy.service'; + +@ApiTags('Proxy') +@Controller('proxy') +export class ProxyController { + constructor(private proxyService: ProxyService) {} + + @ApiOperation({ description: 'Method to create a new proxy user' }) + @Post('newUser') + async newUser(@Body() data: IProxyUser) { + return await this.proxyService.newUser(data); + } + + @ApiOperation({ description: 'get user by its username' }) + @Get('getUser/:userName') + async getUser(@Param('userName') userName: string) { + return await this.proxyService.getUser(userName); + } + + @ApiOperation({ description: 'get all users of proxy' }) + @Get('getAllUsers') + async getAllUsers() { + return await this.proxyService.getAllUsers(); + } + + @ApiOperation({ description: 'adding an operation to user' }) + @Post('operation/add') + async addOperation(@Body() data: IOperation) { + return await this.proxyService.addOperation(data); + } + + @ApiOperation({ description: 'get user payments' }) + @Get('operation/get/:userName') + async getOperations(@Param('userName') userName: string) { + return this.proxyService.getOperations(userName); + } + + @ApiOperation({ description: 'get all payments' }) + @Get('operation/get-all') + async getAllOperations() { + return this.proxyService.getAllOperations(); + } +} diff --git a/backend/src/modules/proxy/proxy.dto.ts b/backend/src/modules/proxy/proxy.dto.ts new file mode 100644 index 0000000..0dbd923 --- /dev/null +++ b/backend/src/modules/proxy/proxy.dto.ts @@ -0,0 +1,12 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export class IProxyUser { + @ApiProperty({ description: 'user name of user to identify them', example: 'username' }) readonly userName!: string; + @ApiProperty({ description: 'some user description if you want', example: 'Description of user' }) readonly description?: string; + @ApiProperty({ description: 'user link to connect to the proxy', example: 'vless://....' }) readonly link!: string; + @ApiProperty({ description: 'telegram user id to connect to user entity', example: '187564' }) readonly user_id?: string; +} + +export class IOperation { + @ApiProperty({ description: 'user name of user, that made new operation', example: 'username' }) readonly userName!: string; +} diff --git a/backend/src/modules/proxy/proxy.module.ts b/backend/src/modules/proxy/proxy.module.ts new file mode 100644 index 0000000..41835f0 --- /dev/null +++ b/backend/src/modules/proxy/proxy.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { LibsModule } from 'libs/libs.module'; +import { ProxyController } from './proxy.controller'; +import { ProxyService } from './proxy.service'; + +@Module({ + imports: [LibsModule], + controllers: [ProxyController], + providers: [ProxyService], +}) +export class ProxyModule {} diff --git a/backend/src/modules/proxy/proxy.service.ts b/backend/src/modules/proxy/proxy.service.ts new file mode 100644 index 0000000..932cb36 --- /dev/null +++ b/backend/src/modules/proxy/proxy.service.ts @@ -0,0 +1,105 @@ +import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'; +import { InjectRepository } from '@nestjs/typeorm'; +import { Payment } from 'libs/database/payment.entity'; +import { ProxyUser } from 'libs/database/proxy_user.entity'; +import { User } from 'libs/database/user.entity'; +import { Repository } from 'typeorm'; +import { IOperation, IProxyUser } from './proxy.dto'; + +@Injectable() +export class ProxyService { + private readonly logger: Logger = new Logger(ProxyService.name); + constructor( + @InjectRepository(ProxyUser) private proxyUserRepository: Repository, + @InjectRepository(Payment) private paymentRepository: Repository, + @InjectRepository(User) private userRepository: Repository, + ) {} + + async newUser(data: IProxyUser) { + try { + if ( + (await this.proxyUserRepository.findOne({ where: { userName: data.userName } })) || + (await this.proxyUserRepository.findOne({ where: { user_id: data.user_id } })) + ) + throw new HttpException('User already exists', HttpStatus.FOUND); + const proxyUser = new ProxyUser(); + const user = data.user_id ? await this.userRepository.findOne({ where: { id: data.user_id } }) : null; + if (user) proxyUser.user = user; + proxyUser.description = data.description; + proxyUser.connectDate = new Date(); + proxyUser.userName = data.userName; + proxyUser.link = data.link; + return await this.proxyUserRepository.save(proxyUser); + } catch (error) { + if (error instanceof HttpException) { + this.logger.debug(`[proxy.newUser] error: user already created`); + throw error; + } + this.logger.debug(`[proxy.newUser] error: ${JSON.stringify(error)}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } + + async getUser(userName: string) { + try { + const user = await this.proxyUserRepository.findOne({ where: { userName: userName } }); + if (!user) throw new HttpException('Not found', HttpStatus.NOT_FOUND); + return user; + } catch (error) { + if (error instanceof HttpException) { + this.logger.debug(`[proxy.getUser] error: not found`); + throw error; + } + this.logger.debug(`[proxy.getUser] error: ${JSON.stringify(error)}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } + + async getAllUsers() { + try { + return await this.proxyUserRepository.find(); + } catch (error) { + this.logger.debug(`[proxy.getAllUsers] error: ${JSON.stringify(error)}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } + + async addOperation(data: IOperation) { + try { + const user = await this.proxyUserRepository.findOne({ where: { userName: data.userName } }); + if (!user) throw new HttpException('Not found', HttpStatus.NOT_FOUND); + return await this.paymentRepository.save({ payTime: new Date(), user: user }); + } catch (error) { + if (error instanceof HttpException) { + this.logger.debug(`[proxy.addOperation] error: not found`); + throw error; + } + this.logger.debug(`[proxy.addOperation] error: ${JSON.stringify(error)}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } + + async getOperations(userName: string) { + try { + const user = await this.proxyUserRepository.findOne({ where: { userName: userName }, relations: { payments: true } }); + if (!user) throw new HttpException('Not found', HttpStatus.NOT_FOUND); + return user.payments; + } catch (error) { + if (error instanceof HttpException) { + this.logger.debug(`[proxy.addOperation] error: not found`); + throw error; + } + this.logger.debug(`[proxy.addOperation] error: ${error}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } + + async getAllOperations() { + try { + return await this.paymentRepository.find(); + } catch (error) { + this.logger.debug(`[proxy.addOperation] error: ${error}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } +} From 70168918a6a04fa99177dd4c65df6a0d0f1c2132 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Mon, 27 Nov 2023 00:23:45 +0300 Subject: [PATCH 12/23] Added edit_timestamp col to post --- backend/libs/database/post.entity.ts | 3 +++ backend/src/modules/post/post.service.ts | 2 +- 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/backend/libs/database/post.entity.ts b/backend/libs/database/post.entity.ts index f58dc2a..739d593 100644 --- a/backend/libs/database/post.entity.ts +++ b/backend/libs/database/post.entity.ts @@ -22,6 +22,9 @@ export class Post { @Column({ type: 'timestamptz' }) public timestamp!: Date; + @Column({ type: 'timestamptz', nullable: true }) + public edit_timestamp?: Date; + @Column({ nullable: false }) public from_user_id!: string; diff --git a/backend/src/modules/post/post.service.ts b/backend/src/modules/post/post.service.ts index 34045e1..4b714b4 100644 --- a/backend/src/modules/post/post.service.ts +++ b/backend/src/modules/post/post.service.ts @@ -41,7 +41,7 @@ export class PostService { } if (post.text !== data.text) { post.text = data.text; - post.timestamp = new Date(); + post.edit_timestamp = new Date(); await this.postRepository.save(post); } return post; From 743e073935fc0c52575122e80fbfa4faeafbb970 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Mon, 27 Nov 2023 00:24:36 +0300 Subject: [PATCH 13/23] Get post to post method --- backend/src/modules/post/post.controller.ts | 6 ++++++ backend/src/modules/post/post.service.ts | 19 +++++++++++++++++++ 2 files changed, 25 insertions(+) diff --git a/backend/src/modules/post/post.controller.ts b/backend/src/modules/post/post.controller.ts index 12953f9..08e0677 100644 --- a/backend/src/modules/post/post.controller.ts +++ b/backend/src/modules/post/post.controller.ts @@ -39,4 +39,10 @@ export class PostController { async editPost(@Param('postId') postId: string, @Body() data: IEditPost) { return await this.postService.editPost(postId, data); } + + @ApiOperation({ description: 'Get post to post' }) + @Get('post') + async post() { + return await this.postService.post(); + } } diff --git a/backend/src/modules/post/post.service.ts b/backend/src/modules/post/post.service.ts index 4b714b4..9220f0b 100644 --- a/backend/src/modules/post/post.service.ts +++ b/backend/src/modules/post/post.service.ts @@ -95,4 +95,23 @@ export class PostService { throw new HttpException("Can't find post with this media group id", HttpStatus.BAD_REQUEST); } } + + async post() { + try { + const posts = await this.postRepository.find({ order: { timestamp: 'ASC' }, where: { posted: false }, relations: { images: true } }); + if (!posts) throw new HttpException('Nothing to post', HttpStatus.NOT_FOUND); + const post = posts[0]; + post.posted = true; + this.logger.log(`[post.post] Post ${post.uuid} is posted`); + await this.postRepository.save(post); + return post; + } catch (error) { + if (error instanceof HttpException) { + this.logger.debug('[post.post] Not found'); + throw error; + } + this.logger.debug(`[post.post] error: ${JSON.stringify(error)}`); + throw new HttpException('Bad data', HttpStatus.BAD_REQUEST); + } + } } From 318a40b961b0ef1ed83fa0de2baf967b5c89cbed Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Tue, 28 Nov 2023 22:54:39 +0300 Subject: [PATCH 14/23] Fix for posts not found --- backend/src/modules/post/post.service.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/backend/src/modules/post/post.service.ts b/backend/src/modules/post/post.service.ts index 9220f0b..08ba6f1 100644 --- a/backend/src/modules/post/post.service.ts +++ b/backend/src/modules/post/post.service.ts @@ -99,7 +99,7 @@ export class PostService { async post() { try { const posts = await this.postRepository.find({ order: { timestamp: 'ASC' }, where: { posted: false }, relations: { images: true } }); - if (!posts) throw new HttpException('Nothing to post', HttpStatus.NOT_FOUND); + if (!posts.length) throw new HttpException('Nothing to post', HttpStatus.NOT_FOUND); const post = posts[0]; post.posted = true; this.logger.log(`[post.post] Post ${post.uuid} is posted`); From a76757dba22f18c53c0b6d30f21ed6288ea244f2 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Tue, 28 Nov 2023 22:55:00 +0300 Subject: [PATCH 15/23] Addes ping method --- backend/src/app.controller.ts | 12 ++++++++++++ backend/src/app.module.ts | 3 ++- 2 files changed, 14 insertions(+), 1 deletion(-) create mode 100644 backend/src/app.controller.ts diff --git a/backend/src/app.controller.ts b/backend/src/app.controller.ts new file mode 100644 index 0000000..ea73f2f --- /dev/null +++ b/backend/src/app.controller.ts @@ -0,0 +1,12 @@ +import { Controller, Get } from '@nestjs/common'; +import { ApiOperation, ApiTags } from '@nestjs/swagger'; + +@ApiTags('App') +@Controller() +export class AppController { + @ApiOperation({ description: 'check site availability' }) + @Get('ping') + pingpong() { + return 'pong'; + } +} diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 1adba1e..09548a3 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -2,6 +2,7 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule, TypeOrmModuleOptions } from '@nestjs/typeorm'; import { config } from 'config'; import { LibsModule } from 'libs/libs.module'; +import { AppController } from './app.controller'; import { AdminModule } from './modules/admin/admin.module'; import { ImageModule } from './modules/image/image.module'; import { AppInitService } from './modules/initialization/app.init.service'; @@ -19,7 +20,7 @@ import { UserModule } from './modules/user/user.module'; ProxyModule, TypeOrmModule.forRoot(config.database), ], - controllers: [], + controllers: [AppController], providers: [AppInitService], }) export class AppModule {} From 859a351294c02473eb59954873c825bd5cd5e016 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Wed, 29 Nov 2023 19:03:28 +0300 Subject: [PATCH 16/23] Added docker to bot project --- docker-compose.yml | 11 +++++++++++ neuro-reply-bot-reworked | 2 +- 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/docker-compose.yml b/docker-compose.yml index a334e03..efea673 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -35,6 +35,17 @@ services: - db restart: always + bot: + container_name: neuro_bot + build: ./neuro-reply-bot-reworked + environment: + - API_URL=http://backend:3000 + networks: + - labnet + depends_on: + - backend + restart: always + volumes: neuro_postgres_db: driver: local diff --git a/neuro-reply-bot-reworked b/neuro-reply-bot-reworked index 8c2d706..f63954e 160000 --- a/neuro-reply-bot-reworked +++ b/neuro-reply-bot-reworked @@ -1 +1 @@ -Subproject commit 8c2d706401670443ce7813140c72feaa1d65c04c +Subproject commit f63954e8ff50c6d727ec8193bfe2fc90e80e5da3 From 9c5c3964f8bf0448e07dbc620f97d50a3aa44f9c Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Wed, 29 Nov 2023 19:06:04 +0300 Subject: [PATCH 17/23] Edited camelCase to kebab-case --- backend/src/modules/proxy/proxy.controller.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/modules/proxy/proxy.controller.ts b/backend/src/modules/proxy/proxy.controller.ts index 87e565e..82a25ea 100644 --- a/backend/src/modules/proxy/proxy.controller.ts +++ b/backend/src/modules/proxy/proxy.controller.ts @@ -9,19 +9,19 @@ export class ProxyController { constructor(private proxyService: ProxyService) {} @ApiOperation({ description: 'Method to create a new proxy user' }) - @Post('newUser') + @Post('new-user') async newUser(@Body() data: IProxyUser) { return await this.proxyService.newUser(data); } @ApiOperation({ description: 'get user by its username' }) - @Get('getUser/:userName') + @Get('get-user/:userName') async getUser(@Param('userName') userName: string) { return await this.proxyService.getUser(userName); } @ApiOperation({ description: 'get all users of proxy' }) - @Get('getAllUsers') + @Get('get-all-users') async getAllUsers() { return await this.proxyService.getAllUsers(); } From 217d7a8dc2217e02eeb7a6207f2684c7a29e57c5 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Wed, 29 Nov 2023 19:15:16 +0300 Subject: [PATCH 18/23] Undefined check --- backend/src/modules/proxy/proxy.service.ts | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/backend/src/modules/proxy/proxy.service.ts b/backend/src/modules/proxy/proxy.service.ts index 932cb36..25282cf 100644 --- a/backend/src/modules/proxy/proxy.service.ts +++ b/backend/src/modules/proxy/proxy.service.ts @@ -18,8 +18,9 @@ export class ProxyService { async newUser(data: IProxyUser) { try { if ( - (await this.proxyUserRepository.findOne({ where: { userName: data.userName } })) || - (await this.proxyUserRepository.findOne({ where: { user_id: data.user_id } })) + (await this.proxyUserRepository.findOne({ where: { userName: data.userName } })) || data.user_id + ? await this.proxyUserRepository.findOne({ where: { user_id: data.user_id } }) + : false ) throw new HttpException('User already exists', HttpStatus.FOUND); const proxyUser = new ProxyUser(); From 2774dafadbe701201b864795c6e2e69b41dfff75 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Thu, 30 Nov 2023 15:03:31 +0300 Subject: [PATCH 19/23] Edited ssh to http submodule --- .gitmodules | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.gitmodules b/.gitmodules index adf5066..3a5cc74 100644 --- a/.gitmodules +++ b/.gitmodules @@ -1,4 +1,4 @@ [submodule "neuro-reply-bot-reworked"] path = neuro-reply-bot-reworked - url = git@github.com:MrSedan/neuro-reply-bot-reworked.git + url = https://github.com/MrSedan/neuro-reply-bot-reworked.git branch = dev \ No newline at end of file From df69bed732c2866fe0f89f2f693a7f51e927b528 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Thu, 30 Nov 2023 18:23:57 +0300 Subject: [PATCH 20/23] dev docker, without error, idk work hot reload or not --- backend/Dockerfile.dev | 9 ++++++ docker-compose.dev.yml | 72 ++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 81 insertions(+) create mode 100644 backend/Dockerfile.dev create mode 100644 docker-compose.dev.yml diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev new file mode 100644 index 0000000..9be3685 --- /dev/null +++ b/backend/Dockerfile.dev @@ -0,0 +1,9 @@ +FROM node:lts-alpine +WORKDIR /app +RUN corepack enable && corepack prepare pnpm@latest --activate +COPY package.json pnpm-*.yaml ./ +RUN pnpm install --frozen-lockfile +COPY . . +RUN pnpm build +EXPOSE 3000 +CMD [ "pnpm", "start:dev" ] \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..023c43d --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,72 @@ +version: '3.9' + +services: + db: + container_name: neuro_db_dev + image: postgres:alpine + environment: + - POSTGRES_USER=${DATABASE_USER} + - POSTGRES_PASSWORD=${DATABASE_PASSWORD} + - POSTGRES_DB=${DATABASE_NAME} + - PGDATA=/var/lib/postgresql/data/pgdata + ports: + - "${DATABASE_PORT}:5432" + env_file: + - .env + networks: + - labnet + volumes: + - neuro_postgres_db:/var/lib/postgresql/data + restart: always + + backend: + container_name: neuro_backend_dev + build: + context: ./backend + dockerfile: Dockerfile.dev + develop: + watch: + - action: sync + path: ./src + target: ./src/src + - action: rebuild + path: package.json + - action: rebuild + path: ./libs + environment: + - DATABASE_PORT=5432 + - DATABASE_HOST=db + env_file: + - .env + networks: + - labnet + ports: + - 3000:3000 + depends_on: + - db + restart: always + + bot: + container_name: neuro_bot_dev + + build: + context: ./neuro-reply-bot-reworked + dockerfile: Dockerfile.dev + environment: + - API_URL=http://backend:3000 + networks: + - labnet + depends_on: + - backend + restart: always + develop: + watch: + - action: sync + path: ./ + target: ./ + +volumes: + neuro_postgres_db: + driver: local +networks: + labnet: From 45ca12f70bd3508d46d393656a5c552eda7ef5ba Mon Sep 17 00:00:00 2001 From: Errormacr Date: Thu, 30 Nov 2023 18:25:26 +0300 Subject: [PATCH 21/23] add dockerfile.dev in bot --- neuro-reply-bot-reworked | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/neuro-reply-bot-reworked b/neuro-reply-bot-reworked index f63954e..142d18b 160000 --- a/neuro-reply-bot-reworked +++ b/neuro-reply-bot-reworked @@ -1 +1 @@ -Subproject commit f63954e8ff50c6d727ec8193bfe2fc90e80e5da3 +Subproject commit 142d18bac35f49e7e26047fdf696eb7cb1c7f7b1 From 5f0cd8459fce222ea6d0eab61309b2ebee657fa5 Mon Sep 17 00:00:00 2001 From: Errormacr Date: Thu, 30 Nov 2023 19:08:16 +0300 Subject: [PATCH 22/23] Hot reload on bot --- docker-compose.dev.yml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 023c43d..6aed970 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -27,8 +27,10 @@ services: develop: watch: - action: sync - path: ./src - target: ./src/src + path: ./backend/src + target: ./app/src + ignore: + - node_modules/ - action: rebuild path: package.json - action: rebuild @@ -62,8 +64,8 @@ services: develop: watch: - action: sync - path: ./ - target: ./ + path: ./neuro-reply-bot-reworked/ + target: ./app/ volumes: neuro_postgres_db: From f5787eeabf6093a8648f26e0fc801bf858efc2a0 Mon Sep 17 00:00:00 2001 From: Sergey Elpashev Date: Thu, 30 Nov 2023 19:28:31 +0300 Subject: [PATCH 23/23] Removed build for dev --- backend/Dockerfile.dev | 1 - 1 file changed, 1 deletion(-) diff --git a/backend/Dockerfile.dev b/backend/Dockerfile.dev index 9be3685..6d01c64 100644 --- a/backend/Dockerfile.dev +++ b/backend/Dockerfile.dev @@ -4,6 +4,5 @@ RUN corepack enable && corepack prepare pnpm@latest --activate COPY package.json pnpm-*.yaml ./ RUN pnpm install --frozen-lockfile COPY . . -RUN pnpm build EXPOSE 3000 CMD [ "pnpm", "start:dev" ] \ No newline at end of file