Initial commit: backend

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
Alireza Hassani
2026-10-03 23:17:33 +03:30
co-authored by Cursor
commit b0642a26e0
43 changed files with 6865 additions and 0 deletions
+149
View File
@@ -0,0 +1,149 @@
import {
IsArray,
IsBoolean,
IsIn,
IsInt,
IsOptional,
IsString,
Matches,
MaxLength,
Min,
MinLength,
} from 'class-validator';
import { Type } from 'class-transformer';
export const BUSINESS_STATUSES = [
'draft',
'pending_review',
'published',
'hidden',
'rejected',
] as const;
export type BusinessStatus = (typeof BUSINESS_STATUSES)[number];
export class CreateBusinessDto {
@IsString()
meshkeeBusinessId!: string;
@IsString()
@Matches(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)
@MaxLength(100)
slug!: string;
/** Written to Meshkee only (not stored in marketplace DB). */
@IsOptional()
@IsString()
@MaxLength(255)
name?: string;
/** Meshkee business_category ids — written to Meshkee only. */
@IsOptional()
@IsArray()
@IsString({ each: true })
meshkeeCategoryIds?: string[];
@IsOptional()
@IsIn(BUSINESS_STATUSES)
status?: BusinessStatus;
@IsOptional()
@IsBoolean()
isFeatured?: boolean;
@IsOptional()
@Type(() => Number)
@IsInt()
sortWeight?: number;
}
/** Public shop signup: creates a NEW Meshkee business + IranBay marketplace listing. */
export class RegisterShopDto {
@IsString()
@MaxLength(255)
name!: string;
@IsOptional()
@IsString()
@Matches(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)
@MaxLength(100)
slug?: string;
@IsOptional()
@IsString()
@MaxLength(5000)
about?: string;
@IsOptional()
@IsArray()
@IsString({ each: true })
meshkeeCategoryIds?: string[];
/**
* Account password confirmation — Meshkee create-owner updates password for
* existing cells; must match the registrant’s current password.
*/
@IsString()
@MinLength(8)
ownerPassword!: string;
}
export class UpdateBusinessDto {
@IsOptional()
@IsString()
@Matches(/^[a-z0-9]+(?:-[a-z0-9]+)*$/)
@MaxLength(100)
slug?: string;
/** Written to Meshkee only. */
@IsOptional()
@IsString()
@MaxLength(255)
name?: string;
/** Meshkee business_category ids — written to Meshkee only. */
@IsOptional()
@IsArray()
@IsString({ each: true })
meshkeeCategoryIds?: string[];
@IsOptional()
@IsIn(BUSINESS_STATUSES)
status?: BusinessStatus;
@IsOptional()
@IsBoolean()
isFeatured?: boolean;
@IsOptional()
@Type(() => Number)
@IsInt()
sortWeight?: number;
}
export class ListBusinessesDto {
@IsOptional()
@IsString()
q?: string;
@IsOptional()
@IsIn([...BUSINESS_STATUSES, 'all'])
status?: BusinessStatus | 'all';
@IsOptional()
@IsBoolean()
@Type(() => Boolean)
featured?: boolean;
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
page?: number;
@IsOptional()
@Type(() => Number)
@IsInt()
@Min(1)
limit?: number;
}