This commit is contained in:
2026-02-19 09:42:28 +03:30
parent 61f473ea34
commit 5719544fe1
6 changed files with 14 additions and 2625 deletions
File diff suppressed because it is too large Load Diff
@@ -1,91 +0,0 @@
import { Migration } from '@mikro-orm/migrations';
export class Migration20260218113230_init extends Migration {
override async up(): Promise<void> {
this.addSql(`create table "categories" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "parent_id" char(26) null, "title" varchar(255) not null, "is_active" boolean not null default true, "avatar_url" varchar(255) null, "order" int null, constraint "categories_pkey" primary key ("id"));`);
this.addSql(`create table "field" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "entity_type" text check ("entity_type" in ('product', 'print')) not null, "entity_id" char(26) not null, "name" varchar(255) not null, "type" text check ("type" in ('text', 'textarea', 'number', 'select', 'radio', 'checkbox', 'date')) not null, "is_required" boolean not null default false, "multiple" boolean not null default false, "order" int null, constraint "field_pkey" primary key ("id"));`);
this.addSql(`create table "field_option" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "value" varchar(255) not null, "field_id" char(26) not null, "order" int null, constraint "field_option_pkey" primary key ("id"));`);
this.addSql(`create table "otp" ("phone" varchar(255) not null, "code" varchar(255) not null, "expires_at" timestamptz not null, constraint "otp_pkey" primary key ("phone"));`);
this.addSql(`create index "otp_phone_index" on "otp" ("phone");`);
this.addSql(`create table "permissions" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "name" text check ("name" in ('manage_products', 'manage_categories', 'view_all_request_order', 'view_all_invoiced_orders', 'view_my_assigned_invoiced_requests', 'view_all_orders', 'create_order', 'update_order', 'assign_designer', 'create_order_print', 'change_order_status', 'remove_order', 'manage_admins', 'manage_roles', 'manage_users', 'manage_payments', 'manage_settings', 'manage_form_builder', 'manage_print')) not null, "title" varchar(255) not null, constraint "permissions_pkey" primary key ("id"));`);
this.addSql(`create table "print" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "title" varchar(255) not null, "order" int null, constraint "print_pkey" primary key ("id"));`);
this.addSql(`create table "products" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "category_id" char(26) not null, "title" varchar(255) not null, "desc" varchar(255) not null, "quantities" jsonb not null, "link_url" text null, "is_active" boolean not null default true, "images" jsonb null, "order" int not null, constraint "products_pkey" primary key ("id"));`);
this.addSql(`create table "refreshtokens" ("hashed_token" varchar(255) not null, "owner_id" varchar(255) not null, "type" text check ("type" in ('user', 'admin')) not null, "expires_at" timestamptz not null, constraint "refreshtokens_pkey" primary key ("hashed_token"));`);
this.addSql(`create index "refreshtokens_hashed_token_index" on "refreshtokens" ("hashed_token");`);
this.addSql(`create table "roles" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "name" varchar(255) not null, "title" varchar(255) not null, "is_system" boolean not null default false, constraint "roles_pkey" primary key ("id"));`);
this.addSql(`alter table "roles" add constraint "roles_name_unique" unique ("name");`);
this.addSql(`create table "admins" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "first_name" varchar(255) null, "last_name" varchar(255) null, "phone" varchar(255) not null, "role_id" char(26) not null, constraint "admins_pkey" primary key ("id"));`);
this.addSql(`alter table "admins" add constraint "admins_phone_unique" unique ("phone");`);
this.addSql(`create table "notification_preferences" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "admin_id" char(26) null, "events" jsonb null, constraint "notification_preferences_pkey" primary key ("id"));`);
this.addSql(`alter table "notification_preferences" add constraint "notification_preferences_admin_id_unique" unique ("admin_id");`);
this.addSql(`create table "role_permissions" ("role_id" char(26) not null, "permission_id" char(26) not null, constraint "role_permissions_pkey" primary key ("role_id", "permission_id"));`);
this.addSql(`create table "sms_logs" ("id" serial primary key, "phone" varchar(255) not null, "created_at" timestamptz not null);`);
this.addSql(`create table "users" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "first_name" varchar(255) null, "last_name" varchar(255) null, "phone" varchar(255) not null, "is_active" boolean not null default true, "gender" boolean null default true, "max_credit" int not null default 0, "addresse" varchar(255) null, constraint "users_pkey" primary key ("id"));`);
this.addSql(`alter table "users" add constraint "users_phone_unique" unique ("phone");`);
this.addSql(`create table "orders" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "user_id" char(26) not null, "creator_id" char(26) null, "order_number" serial, "discount" int null, "sub_total" int null, "tax_amount" int null, "total" int null, "paid_amount" int not null default 0, "balance" int not null default 0, "estimated_days" int null, "status" text check ("status" in ('request', 'invoiced', 'order')) not null default 'request', "payment_method" varchar(255) null, "invoiced_at" timestamptz null, "enable_tax" boolean not null default false, constraint "orders_pkey" primary key ("id"));`);
this.addSql(`create index "orders_user_id_index" on "orders" ("user_id");`);
this.addSql(`create table "payments" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "order_id" char(26) not null, "creator_id" char(26) null, "amount" numeric(10,0) not null, "token" varchar(255) null, "method" text check ("method" in ('Online', 'Cash', 'Credit')) not null, "gateway" text check ("gateway" in ('zarinpal')) null, "transaction_id" varchar(255) null, "status" text check ("status" in ('pending', 'paid', 'failed', 'refunded')) not null, "verify_response" jsonb null, "paid_at" varchar(255) null, "failed_at" varchar(255) null, "attachments" text[] null, "description" varchar(255) null, constraint "payments_pkey" primary key ("id"));`);
this.addSql(`create index "payments_order_id_index" on "payments" ("order_id");`);
this.addSql(`alter table "payments" add constraint "payments_token_unique" unique ("token");`);
this.addSql(`create table "order_items" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "order_id" char(26) not null, "product_id" char(26) not null, "status" text check ("status" in ('created', 'invoiced', 'waiting_to_confirm_invoice', 'design_initiated', 'design_finished', 'design_revision', 'ready_to_printing', 'in_printing', 'ready_for_delivery', 'delivered', 'after_print_cover', 'after_print_boxing', 'after_print_cartoning', 'finished', 'canceled')) not null, "designer_id" char(26) null, "attributes" jsonb null, "quantity" int not null, "unit_price" int null, "discount" int null, "description" text null, "admin_description" text null, "attachments" jsonb null, "print_attributes" jsonb null, "confirmed_at" timestamptz null, "print_form_created_at" timestamptz null, constraint "order_items_pkey" primary key ("id"));`);
this.addSql(`create index "order_items_order_id_index" on "order_items" ("order_id");`);
this.addSql(`create table "ticket" ("id" char(26) not null, "deleted_at" timestamptz null, "content" text not null, "user_id" char(26) null, "admin_id" char(26) null, "attachments" jsonb null, "order_item_id" char(26) not null, "parent_id" char(26) null, "created_at" timestamptz not null default now(), "read_at" timestamptz null, constraint "ticket_pkey" primary key ("id"));`);
this.addSql(`create table "notifications" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "user_id" char(26) null, "admin_id" char(26) null, "title" text check ("title" in ('newRequest', 'invoiced', 'newOrder', 'designerAssign', 'paymentSuccess')) not null, "content" varchar(255) not null, "seen_at" timestamptz null, constraint "notifications_pkey" primary key ("id"));`);
this.addSql(`create table "credit_transactions" ("id" char(26) not null, "created_at" timestamptz not null default now(), "deleted_at" timestamptz null, "user_id" char(26) not null, "order_id" varchar(255) not null, "amount" numeric(10,0) not null, "balance" numeric(10,0) not null, "type" text check ("type" in ('')) not null, constraint "credit_transactions_pkey" primary key ("id"));`);
this.addSql(`create index "credit_transactions_user_id_index" on "credit_transactions" ("user_id");`);
this.addSql(`alter table "categories" add constraint "categories_parent_id_foreign" foreign key ("parent_id") references "categories" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "field_option" add constraint "field_option_field_id_foreign" foreign key ("field_id") references "field" ("id") on update cascade;`);
this.addSql(`alter table "products" add constraint "products_category_id_foreign" foreign key ("category_id") references "categories" ("id") on update cascade;`);
this.addSql(`alter table "admins" add constraint "admins_role_id_foreign" foreign key ("role_id") references "roles" ("id") on update cascade;`);
this.addSql(`alter table "notification_preferences" add constraint "notification_preferences_admin_id_foreign" foreign key ("admin_id") references "admins" ("id") on update cascade on delete cascade;`);
this.addSql(`alter table "role_permissions" add constraint "role_permissions_role_id_foreign" foreign key ("role_id") references "roles" ("id") on update cascade;`);
this.addSql(`alter table "role_permissions" add constraint "role_permissions_permission_id_foreign" foreign key ("permission_id") references "permissions" ("id") on update cascade;`);
this.addSql(`alter table "orders" add constraint "orders_user_id_foreign" foreign key ("user_id") references "users" ("id") on update cascade;`);
this.addSql(`alter table "orders" add constraint "orders_creator_id_foreign" foreign key ("creator_id") references "admins" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "payments" add constraint "payments_order_id_foreign" foreign key ("order_id") references "orders" ("id") on update cascade;`);
this.addSql(`alter table "payments" add constraint "payments_creator_id_foreign" foreign key ("creator_id") references "admins" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "order_items" add constraint "order_items_order_id_foreign" foreign key ("order_id") references "orders" ("id") on update cascade;`);
this.addSql(`alter table "order_items" add constraint "order_items_product_id_foreign" foreign key ("product_id") references "products" ("id") on update cascade;`);
this.addSql(`alter table "order_items" add constraint "order_items_designer_id_foreign" foreign key ("designer_id") references "admins" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "ticket" add constraint "ticket_user_id_foreign" foreign key ("user_id") references "users" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "ticket" add constraint "ticket_admin_id_foreign" foreign key ("admin_id") references "admins" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "ticket" add constraint "ticket_order_item_id_foreign" foreign key ("order_item_id") references "order_items" ("id") on update cascade;`);
this.addSql(`alter table "ticket" add constraint "ticket_parent_id_foreign" foreign key ("parent_id") references "ticket" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "notifications" add constraint "notifications_user_id_foreign" foreign key ("user_id") references "users" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "notifications" add constraint "notifications_admin_id_foreign" foreign key ("admin_id") references "admins" ("id") on update cascade on delete set null;`);
this.addSql(`alter table "credit_transactions" add constraint "credit_transactions_user_id_foreign" foreign key ("user_id") references "users" ("id") on update cascade;`);
}
}
@@ -1,44 +0,0 @@
import { Migration } from '@mikro-orm/migrations';
export class Migration20260218114512_orderCalc extends Migration {
override async up(): Promise<void> {
this.addSql(`
CREATE OR REPLACE FUNCTION update_order_paid_amount()
RETURNS TRIGGER AS $$
BEGIN
UPDATE orders o
SET paid_amount = (
SELECT COALESCE(SUM(p.amount), 0)
FROM payments p
WHERE p.order_id = COALESCE(NEW.order_id, OLD.order_id)
AND p.status = 'Paid'
)
WHERE o.id = COALESCE(NEW.order_id, OLD.order_id);
RETURN NULL;
END;
$$ LANGUAGE plpgsql;
`);
this.addSql(`
CREATE TRIGGER trg_update_order_paid_amount
AFTER INSERT OR UPDATE OR DELETE
ON payments
FOR EACH ROW
EXECUTE FUNCTION update_order_paid_amount();
`);
this.addSql(`
CREATE INDEX idx_payments_order_status
ON payments(order_id, status);
`);
}
override async down(): Promise<void> {
this.addSql(`DROP TRIGGER IF EXISTS trg_update_order_paid_amount ON payments;`);
this.addSql(`DROP FUNCTION IF EXISTS update_order_paid_amount;`);
this.addSql(`DROP INDEX IF EXISTS idx_payments_order_status;`);
}
}
+8 -1
View File
@@ -6,13 +6,20 @@ import { Invoice } from './entities/invoice.entity';
import { InvoiceItem } from './entities/invoice-item.entity'; import { InvoiceItem } from './entities/invoice-item.entity';
import { ProductModule } from '../product/product.module'; import { ProductModule } from '../product/product.module';
import { InvoiceRepository } from './repositories/invoice.repository'; import { InvoiceRepository } from './repositories/invoice.repository';
import { JwtModule } from '@nestjs/jwt';
import { RolesModule } from '../roles/roles.module';
import { AuthModule } from '../auth/auth.module';
@Module({ @Module({
imports: [ imports: [
MikroOrmModule.forFeature([Invoice, InvoiceItem]), MikroOrmModule.forFeature([Invoice, InvoiceItem]),
ProductModule, ProductModule,
RolesModule,
JwtModule,
AuthModule
], ],
controllers: [InvoiceController], controllers: [InvoiceController],
providers: [InvoiceService, InvoiceRepository], providers: [InvoiceService, InvoiceRepository],
exports: [InvoiceService, InvoiceRepository],
}) })
export class InvoiceModule {} export class InvoiceModule { }
+2 -2
View File
@@ -61,14 +61,14 @@ export class RequestController {
return this.requestService.findOneAsAdmin(id); return this.requestService.findOneAsAdmin(id);
} }
@Patch('public/request/:id') @Patch('admin/request/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.UPDATE_REQUEST) @Permissions(PermissionEnum.UPDATE_REQUEST)
updateRequestAsAdmin(@Param('id') id: string, @Body() dto: UpdateRequestDto) { updateRequestAsAdmin(@Param('id') id: string, @Body() dto: UpdateRequestDto) {
return this.requestService.updateAsAdmin(id, dto); return this.requestService.updateAsAdmin(id, dto);
} }
@Delete('public/request/:id') @Delete('admin/request/:id')
@UseGuards(AdminAuthGuard) @UseGuards(AdminAuthGuard)
@Permissions(PermissionEnum.DELETE_REQUEST) @Permissions(PermissionEnum.DELETE_REQUEST)
removeRequestAsAdmin(@Param('id') id: string) { removeRequestAsAdmin(@Param('id') id: string) {
+4
View File
@@ -7,12 +7,16 @@ import { RequestItem } from './entities/request-item.entity';
import { RequestRepository } from './repositories/request.repository'; import { RequestRepository } from './repositories/request.repository';
import { UserModule } from '../user/user.module'; import { UserModule } from '../user/user.module';
import { ProductModule } from '../product/product.module'; import { ProductModule } from '../product/product.module';
import { AuthModule } from '../auth/auth.module';
import { JwtModule } from '@nestjs/jwt';
@Module({ @Module({
imports: [ imports: [
MikroOrmModule.forFeature([Request, RequestItem]), MikroOrmModule.forFeature([Request, RequestItem]),
UserModule, UserModule,
ProductModule, ProductModule,
JwtModule,
AuthModule
], ],
controllers: [RequestController], controllers: [RequestController],
providers: [RequestService, RequestRepository], providers: [RequestService, RequestRepository],