feat: backend API NestJS + Prisma + JWT auth + todos los módulos

This commit is contained in:
Lizandro Guarnizo
2026-06-01 21:23:04 -05:00
parent b31f778b3b
commit 3c5d81603a
69 changed files with 35734 additions and 0 deletions
+4
View File
@@ -0,0 +1,4 @@
node_modules/
dist/
.env
*.js.map
+8
View File
@@ -0,0 +1,8 @@
{
"$schema": "https://json.schemastore.org/nest-cli",
"collection": "@nestjs/schematics",
"sourceRoot": "src",
"compilerOptions": {
"deleteOutDir": true
}
}
+6283
View File
File diff suppressed because it is too large Load Diff
+54
View File
@@ -0,0 +1,54 @@
{
"name": "prosapp-api",
"version": "1.0.0",
"description": "ProsApp Backend API - NestJS + Prisma + PostgreSQL",
"main": "dist/main.js",
"scripts": {
"build": "nest build",
"start": "node dist/main",
"dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"prisma:generate": "prisma generate",
"prisma:pull": "prisma db pull",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"dependencies": {
"@nestjs/common": "^11.1.24",
"@nestjs/config": "^4.0.4",
"@nestjs/core": "^11.1.24",
"@nestjs/jwt": "^11.0.2",
"@nestjs/passport": "^11.0.5",
"@nestjs/platform-express": "^11.1.24",
"@nestjs/platform-socket.io": "^11.1.24",
"@nestjs/swagger": "^11.4.4",
"@nestjs/websockets": "^11.1.24",
"@prisma/client": "^7.8.0",
"bcryptjs": "^3.0.3",
"class-transformer": "^0.5.1",
"class-validator": "^0.15.1",
"multer": "^2.1.1",
"passport": "^0.7.0",
"passport-jwt": "^4.0.1",
"prisma": "^7.8.0",
"reflect-metadata": "^0.2.2",
"rxjs": "^7.8.2",
"socket.io": "^4.8.3"
},
"devDependencies": {
"@nestjs/cli": "^11.0.21",
"@nestjs/schematics": "^11.1.0",
"@types/bcryptjs": "^2.4.6",
"@types/express": "^5.0.6",
"@types/multer": "^2.1.0",
"@types/node": "^25.9.1",
"@types/passport-jwt": "^4.0.1",
"ts-node": "^10.9.2",
"tsconfig-paths": "^4.2.0",
"typescript": "^6.0.3"
}
}
+3
View File
@@ -0,0 +1,3 @@
import "dotenv/config";
declare const _default: import("@prisma/config").PrismaConfigInternal;
export default _default;
+14
View File
@@ -0,0 +1,14 @@
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
require("dotenv/config");
const config_1 = require("prisma/config");
exports.default = (0, config_1.defineConfig)({
schema: "prisma/schema.prisma",
migrations: {
path: "prisma/migrations",
},
datasource: {
url: process.env["DATABASE_URL"],
},
});
//# sourceMappingURL=prisma.config.js.map
+236
View File
@@ -0,0 +1,236 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "postgresql"
}
model chats {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
user_id String @db.Uuid
professional_id String @db.Uuid
created_at DateTime @default(now()) @db.Timestamptz(6)
users_chats_professional_idTousers users @relation("chats_professional_idTousers", fields: [professional_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
users_chats_user_idTousers users @relation("chats_user_idTousers", fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
messages messages[]
@@unique([user_id, professional_id])
@@index([professional_id], map: "idx_chats_professional_id")
@@index([user_id], map: "idx_chats_user_id")
}
model cities {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
region_id String @db.Uuid
name String @db.VarChar(255)
latitude Decimal? @db.Decimal(10, 7)
longitude Decimal? @db.Decimal(10, 7)
regions regions @relation(fields: [region_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@index([region_id], map: "idx_cities_region_id")
}
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
model comments {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
author_id String @db.Uuid
destination_id String @db.Uuid
service_id String? @db.Uuid
content String?
score Int @db.SmallInt
is_from_user Boolean @default(true)
created_at DateTime @default(now()) @db.Timestamptz(6)
users_comments_author_idTousers users @relation("comments_author_idTousers", fields: [author_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
users_comments_destination_idTousers users @relation("comments_destination_idTousers", fields: [destination_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
services services? @relation(fields: [service_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@index([author_id], map: "idx_comments_author_id")
@@index([destination_id], map: "idx_comments_destination_id")
@@index([service_id], map: "idx_comments_service_id")
}
model countries {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
name String @unique @db.VarChar(255)
regions regions[]
}
model messages {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
chat_id String @db.Uuid
sender_id String @db.Uuid
content String
created_at DateTime @default(now()) @db.Timestamptz(6)
chats chats @relation(fields: [chat_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
users users @relation(fields: [sender_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@index([chat_id], map: "idx_messages_chat_id")
@@index([created_at], map: "idx_messages_created_at")
}
model payment_methods {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
professional_id String @unique @db.Uuid
nequi Boolean? @default(false)
datafono Boolean? @default(false)
transferencia Boolean? @default(false)
professionals professionals @relation(fields: [professional_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
}
model professionals {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
user_id String @unique @db.Uuid
identification String? @db.VarChar(50)
address String?
additional_address String?
profession String? @db.VarChar(255)
rate Decimal? @db.Decimal(10, 2)
rate_preferences String?
location_preferences String? @default("office") @db.VarChar(20)
banner_picture String?
identification_picture String?
certificate_picture String?
latitude Decimal? @db.Decimal(10, 7)
longitude Decimal? @db.Decimal(10, 7)
average_score Decimal? @default(0) @db.Decimal(3, 2)
is_active Boolean? @default(true)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
payment_methods payment_methods?
users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
schedules schedules[]
services services[]
specializations specializations[]
@@index([user_id], map: "idx_professionals_user_id")
}
model professions {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
name String @unique @db.VarChar(255)
}
model regions {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
country_id String @db.Uuid
name String @db.VarChar(255)
cities cities[]
countries countries @relation(fields: [country_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@index([country_id], map: "idx_regions_country_id")
}
model reputations {
user_id String @id @db.Uuid
total Int @default(0)
average Decimal @default(0) @db.Decimal(3, 2)
total_pro Int @default(0)
average_pro Decimal @default(0) @db.Decimal(3, 2)
updated_at DateTime @default(now()) @db.Timestamptz(6)
users users @relation(fields: [user_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
}
/// This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
model schedules {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
professional_id String @db.Uuid
day_of_week Int @db.SmallInt
enabled Boolean? @default(false)
continuous_day Boolean? @default(false)
range1_hour1 DateTime? @db.Time(6)
range1_hour2 DateTime? @db.Time(6)
range2_hour1 DateTime? @db.Time(6)
range2_hour2 DateTime? @db.Time(6)
professionals professionals @relation(fields: [professional_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@unique([professional_id, day_of_week])
@@index([professional_id], map: "idx_schedules_professional_id")
}
model services {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
professional_id String @db.Uuid
user_id String @db.Uuid
address String?
additional_address String?
latitude Decimal? @db.Decimal(10, 7)
longitude Decimal? @db.Decimal(10, 7)
day DateTime @db.Date
description String?
rate Decimal? @db.Decimal(10, 2)
range1_hour1 DateTime? @db.Time(6)
range1_hour2 DateTime? @db.Time(6)
status service_status @default(pending)
location_preference service_location? @default(office)
professional_scored Boolean? @default(false)
user_scored Boolean? @default(false)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
comments comments[]
professionals professionals @relation(fields: [professional_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
users users @relation(fields: [user_id], references: [id], onDelete: NoAction, onUpdate: NoAction)
@@index([day], map: "idx_services_day")
@@index([professional_id], map: "idx_services_professional_id")
@@index([status], map: "idx_services_status")
@@index([user_id], map: "idx_services_user_id")
}
model settings {
key String @id @db.VarChar(100)
value Json
updated_at DateTime @default(now()) @db.Timestamptz(6)
}
model specializations {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
professional_id String @db.Uuid
name String @db.VarChar(255)
picture String?
professionals professionals @relation(fields: [professional_id], references: [id], onDelete: Cascade, onUpdate: NoAction)
@@index([professional_id], map: "idx_specializations_professional_id")
}
model users {
id String @id @default(dbgenerated("uuid_generate_v4()")) @db.Uuid
email String? @unique @db.VarChar(255)
phone String? @unique @db.VarChar(20)
password_hash String? @db.VarChar(255)
name String @db.VarChar(255)
nickname String? @db.VarChar(100)
city String? @db.VarChar(100)
picture String?
birthday DateTime? @db.Date
gender String? @db.VarChar(20)
pro_state Int @default(0) @db.SmallInt
fcm_token String?
is_phone_verified Boolean? @default(false)
is_email_verified Boolean? @default(false)
created_at DateTime @default(now()) @db.Timestamptz(6)
updated_at DateTime @default(now()) @db.Timestamptz(6)
chats_chats_professional_idTousers chats[] @relation("chats_professional_idTousers")
chats_chats_user_idTousers chats[] @relation("chats_user_idTousers")
comments_comments_author_idTousers comments[] @relation("comments_author_idTousers")
comments_comments_destination_idTousers comments[] @relation("comments_destination_idTousers")
messages messages[]
professionals professionals?
reputations reputations?
services services[]
}
enum service_location {
office
delivery
}
enum service_status {
pending
accepted
denied
active
cancelled
completed
self_booked
}
+31
View File
@@ -0,0 +1,31 @@
import { Module } from '@nestjs/common';
import { ConfigModule } from '@nestjs/config';
import { PrismaModule } from './prisma/prisma.module';
import { AuthModule } from './auth/auth.module';
import { UsersModule } from './users/users.module';
import { ProfessionalsModule } from './professionals/professionals.module';
import { ServicesModule } from './services/services.module';
import { CommentsModule } from './comments/comments.module';
import { ChatModule } from './chat/chat.module';
import { LocationsModule } from './locations/locations.module';
import { SettingsModule } from './settings/settings.module';
import { ProfessionsModule } from './professions/professions.module';
import { StorageModule } from './storage/storage.module';
@Module({
imports: [
ConfigModule.forRoot({ isGlobal: true }),
PrismaModule,
AuthModule,
UsersModule,
ProfessionalsModule,
ServicesModule,
CommentsModule,
ChatModule,
LocationsModule,
SettingsModule,
ProfessionsModule,
StorageModule,
],
})
export class AppModule {}
+32
View File
@@ -0,0 +1,32 @@
import { Controller, Post, Body, UseGuards, Get, Req } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { AuthService } from './auth.service';
import { JwtAuthGuard } from './jwt-auth.guard';
@ApiTags('Auth')
@Controller('auth')
export class AuthController {
constructor(private auth: AuthService) {}
@Post('register')
register(@Body() dto: { email: string; password: string; name: string }) {
return this.auth.register(dto.email, dto.password, dto.name);
}
@Post('login')
login(@Body() dto: { email: string; password: string }) {
return this.auth.login(dto.email, dto.password);
}
@Post('phone')
phone(@Body() dto: { phone: string; name?: string }) {
return this.auth.loginOrCreateByPhone(dto.phone, dto.name);
}
@Get('me')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
me(@Req() req) {
return this.auth.me(req.user.sub);
}
}
+20
View File
@@ -0,0 +1,20 @@
import { Module } from '@nestjs/common';
import { JwtModule } from '@nestjs/jwt';
import { PassportModule } from '@nestjs/passport';
import { AuthService } from './auth.service';
import { AuthController } from './auth.controller';
import { JwtStrategy } from './jwt.strategy';
@Module({
imports: [
PassportModule.register({ defaultStrategy: 'jwt' }),
JwtModule.register({
secret: process.env.JWT_SECRET || 'prosapp-secret-dev',
signOptions: { expiresIn: '30d' },
}),
],
providers: [AuthService, JwtStrategy],
controllers: [AuthController],
exports: [AuthService, JwtModule],
})
export class AuthModule {}
+69
View File
@@ -0,0 +1,69 @@
import { Injectable, UnauthorizedException, ConflictException, BadRequestException } from '@nestjs/common';
import { JwtService } from '@nestjs/jwt';
import * as bcrypt from 'bcryptjs';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class AuthService {
constructor(
private prisma: PrismaService,
private jwt: JwtService,
) {}
async register(email: string, password: string, name: string) {
const existing = await this.prisma.users.findUnique({ where: { email } });
if (existing) throw new ConflictException('Email ya registrado');
const password_hash = await bcrypt.hash(password, 10);
const user = await this.prisma.users.create({
data: { email, password_hash, name, is_email_verified: true },
});
return this.generateToken(user);
}
async login(email: string, password: string) {
const user = await this.prisma.users.findUnique({ where: { email } });
if (!user || !user.password_hash) throw new UnauthorizedException('Credenciales inválidas');
const valid = await bcrypt.compare(password, user.password_hash);
if (!valid) throw new UnauthorizedException('Credenciales inválidas');
return this.generateToken(user);
}
async loginOrCreateByPhone(phone: string, name?: string) {
let user = await this.prisma.users.findUnique({ where: { phone } });
if (!user) {
user = await this.prisma.users.create({
data: { phone, name: name || phone, is_phone_verified: true },
});
}
return this.generateToken(user);
}
async me(userId: string) {
return this.prisma.users.findUnique({
where: { id: userId },
include: {
professionals: {
include: { schedules: true, payment_methods: true, specializations: true },
},
reputations: true,
},
});
}
private generateToken(user: any) {
const payload = { sub: user.id, email: user.email, phone: user.phone };
return {
access_token: this.jwt.sign(payload),
user: {
id: user.id,
email: user.email,
phone: user.phone,
name: user.name,
},
};
}
}
+5
View File
@@ -0,0 +1,5 @@
import { Injectable, ExecutionContext } from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
@Injectable()
export class JwtAuthGuard extends AuthGuard('jwt') {}
+21
View File
@@ -0,0 +1,21 @@
import { Injectable } from '@nestjs/common';
import { PassportStrategy } from '@nestjs/passport';
import { ExtractJwt, Strategy } from 'passport-jwt';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class JwtStrategy extends PassportStrategy(Strategy) {
constructor(private prisma: PrismaService) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
ignoreExpiration: false,
secretOrKey: process.env.JWT_SECRET || 'prosapp-secret-dev',
});
}
async validate(payload: { sub: string }) {
const user = await this.prisma.users.findUnique({ where: { id: payload.sub } });
if (!user) return null;
return { sub: user.id, email: user.email, phone: user.phone };
}
}
+38
View File
@@ -0,0 +1,38 @@
import { Controller, Get, Post, Param, Body, UseGuards, Req } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { ChatService } from './chat.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
@ApiTags('Chat')
@Controller('chat')
export class ChatController {
constructor(private chat: ChatService) {}
@Post('start/:professionalId')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
start(@Req() req, @Param('professionalId') professionalId: string) {
return this.chat.getOrCreateChat(req.user.sub, professionalId);
}
@Post(':chatId/message')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
sendMessage(@Req() req, @Param('chatId') chatId: string, @Body() dto: { content: string }) {
return this.chat.sendMessage(chatId, req.user.sub, dto.content);
}
@Get('my')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
myChats(@Req() req) {
return this.chat.getUserChats(req.user.sub);
}
@Get(':chatId/messages')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
messages(@Param('chatId') chatId: string) {
return this.chat.getChatMessages(chatId);
}
}
+61
View File
@@ -0,0 +1,61 @@
import {
WebSocketGateway,
WebSocketServer,
SubscribeMessage,
OnGatewayConnection,
OnGatewayDisconnect,
ConnectedSocket,
MessageBody,
} from '@nestjs/websockets';
import { Server, Socket } from 'socket.io';
import { ChatService } from './chat.service';
import { PrismaService } from '../prisma/prisma.service';
@WebSocketGateway({ cors: { origin: '*' } })
export class ChatGateway implements OnGatewayConnection, OnGatewayDisconnect {
@WebSocketServer()
server!: Server;
private userSockets = new Map<string, string>();
constructor(private chat: ChatService, private prisma: PrismaService) {}
handleConnection(client: Socket) {
const userId = client.handshake.query.userId as string;
if (userId) {
this.userSockets.set(userId, client.id);
client.join(`user:${userId}`);
}
}
handleDisconnect(client: Socket) {
for (const [userId, socketId] of this.userSockets) {
if (socketId === client.id) {
this.userSockets.delete(userId);
break;
}
}
}
@SubscribeMessage('sendMessage')
async handleMessage(@ConnectedSocket() client: Socket, @MessageBody() data: { chatId: string; content: string }) {
const userId = client.handshake.query.userId as string;
const message = await this.chat.sendMessage(data.chatId, userId, data.content);
const chat = await this.prisma.chats.findUnique({
where: { id: data.chatId },
});
if (chat) {
this.server.to(`user:${chat.user_id}`).emit('newMessage', message);
this.server.to(`user:${chat.professional_id}`).emit('newMessage', message);
}
return message;
}
@SubscribeMessage('joinChat')
handleJoinChat(@ConnectedSocket() client: Socket, @MessageBody() chatId: string) {
client.join(`chat:${chatId}`);
}
}
+11
View File
@@ -0,0 +1,11 @@
import { Module } from '@nestjs/common';
import { ChatService } from './chat.service';
import { ChatController } from './chat.controller';
import { ChatGateway } from './chat.gateway';
@Module({
providers: [ChatService, ChatGateway],
controllers: [ChatController],
exports: [ChatService],
})
export class ChatModule {}
+53
View File
@@ -0,0 +1,53 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class ChatService {
constructor(private prisma: PrismaService) {}
async getOrCreateChat(userId: string, professionalId: string) {
const existing = await this.prisma.chats.findUnique({
where: { user_id_professional_id: { user_id: userId, professional_id: professionalId } },
include: { messages: { orderBy: { created_at: 'asc' } } },
});
if (existing) return existing;
return this.prisma.chats.create({
data: { user_id: userId, professional_id: professionalId },
include: { messages: true },
});
}
async sendMessage(chatId: string, senderId: string, content: string) {
const message = await this.prisma.messages.create({
data: { chat_id: chatId, sender_id: senderId, content },
});
await this.prisma.chats.update({
where: { id: chatId },
data: {},
});
return message;
}
getUserChats(userId: string) {
return this.prisma.chats.findMany({
where: {
OR: [{ user_id: userId }, { professional_id: userId }],
},
include: {
users_chats_user_idTousers: { select: { id: true, name: true, picture: true } },
users_chats_professional_idTousers: { select: { id: true, name: true, picture: true } },
messages: { orderBy: { created_at: 'desc' }, take: 1 },
},
});
}
getChatMessages(chatId: string) {
return this.prisma.messages.findMany({
where: { chat_id: chatId },
orderBy: { created_at: 'asc' },
});
}
}
@@ -0,0 +1,32 @@
import { Controller, Get, Post, Param, Body, UseGuards, Req } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { CommentsService } from './comments.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
@ApiTags('Comments')
@Controller('comments')
export class CommentsController {
constructor(private comments: CommentsService) {}
@Post()
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
create(@Req() req, @Body() data: any) {
return this.comments.create({ ...data, author_id: req.user.sub });
}
@Get('user/:userId')
getScoresForUser(@Param('userId') id: string) {
return this.comments.getScoresForUser(id);
}
@Get('professional/:userId')
getScoresForProfessional(@Param('userId') id: string) {
return this.comments.getScoresForProfessional(id);
}
@Get('reputation/:userId')
getReputation(@Param('userId') id: string) {
return this.comments.getReputation(id);
}
}
+10
View File
@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { CommentsService } from './comments.service';
import { CommentsController } from './comments.controller';
@Module({
providers: [CommentsService],
controllers: [CommentsController],
exports: [CommentsService],
})
export class CommentsModule {}
+38
View File
@@ -0,0 +1,38 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class CommentsService {
constructor(private prisma: PrismaService) {}
create(data: {
author_id: string;
destination_id: string;
service_id?: string;
content?: string;
score: number;
is_from_user: boolean;
}) {
return this.prisma.comments.create({ data });
}
getScoresForUser(userId: string) {
return this.prisma.comments.findMany({
where: { destination_id: userId, is_from_user: false },
include: { users_comments_author_idTousers: { select: { name: true, picture: true } } },
orderBy: { created_at: 'desc' },
});
}
getScoresForProfessional(userId: string) {
return this.prisma.comments.findMany({
where: { destination_id: userId, is_from_user: true },
include: { users_comments_author_idTousers: { select: { name: true, picture: true } } },
orderBy: { created_at: 'desc' },
});
}
getReputation(userId: string) {
return this.prisma.reputations.findUnique({ where: { user_id: userId } });
}
}
+94
View File
@@ -0,0 +1,94 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma-related types and utilities in a browser.
* Use it to get access to models, enums, and input types.
*
* This file does not contain a `PrismaClient` class, nor several other helpers that are intended as server-side only.
* See `client.ts` for the standard, server-side entry point.
*
* 🟢 You can import this file directly.
*/
import * as Prisma from './internal/prismaNamespaceBrowser'
export { Prisma }
export * as $Enums from './enums'
export * from './enums';
/**
* Model chats
*
*/
export type chats = Prisma.chatsModel
/**
* Model cities
*
*/
export type cities = Prisma.citiesModel
/**
* Model comments
* This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
*/
export type comments = Prisma.commentsModel
/**
* Model countries
*
*/
export type countries = Prisma.countriesModel
/**
* Model messages
*
*/
export type messages = Prisma.messagesModel
/**
* Model payment_methods
*
*/
export type payment_methods = Prisma.payment_methodsModel
/**
* Model professionals
*
*/
export type professionals = Prisma.professionalsModel
/**
* Model professions
*
*/
export type professions = Prisma.professionsModel
/**
* Model regions
*
*/
export type regions = Prisma.regionsModel
/**
* Model reputations
*
*/
export type reputations = Prisma.reputationsModel
/**
* Model schedules
* This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
*/
export type schedules = Prisma.schedulesModel
/**
* Model services
*
*/
export type services = Prisma.servicesModel
/**
* Model settings
*
*/
export type settings = Prisma.settingsModel
/**
* Model specializations
*
*/
export type specializations = Prisma.specializationsModel
/**
* Model users
*
*/
export type users = Prisma.usersModel
+116
View File
@@ -0,0 +1,116 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file should be your main import to use Prisma. Through it you get access to all the models, enums, and input types.
* If you're looking for something you can import in the client-side of your application, please refer to the `browser.ts` file instead.
*
* 🟢 You can import this file directly.
*/
import * as process from 'node:process'
import * as path from 'node:path'
import * as runtime from "@prisma/client/runtime/client"
import * as $Enums from "./enums"
import * as $Class from "./internal/class"
import * as Prisma from "./internal/prismaNamespace"
export * as $Enums from './enums'
export * from "./enums"
/**
* ## Prisma Client
*
* Type-safe database client for TypeScript
* @example
* ```
* const prisma = new PrismaClient({
* adapter: new PrismaPg({ connectionString: process.env.DATABASE_URL })
* })
* // Fetch zero or more Chats
* const chats = await prisma.chats.findMany()
* ```
*
* Read more in our [docs](https://pris.ly/d/client).
*/
export const PrismaClient = $Class.getPrismaClientClass()
export type PrismaClient<LogOpts extends Prisma.LogLevel = never, OmitOpts extends Prisma.PrismaClientOptions["omit"] = Prisma.PrismaClientOptions["omit"], ExtArgs extends runtime.Types.Extensions.InternalArgs = runtime.Types.Extensions.DefaultArgs> = $Class.PrismaClient<LogOpts, OmitOpts, ExtArgs>
export { Prisma }
/**
* Model chats
*
*/
export type chats = Prisma.chatsModel
/**
* Model cities
*
*/
export type cities = Prisma.citiesModel
/**
* Model comments
* This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
*/
export type comments = Prisma.commentsModel
/**
* Model countries
*
*/
export type countries = Prisma.countriesModel
/**
* Model messages
*
*/
export type messages = Prisma.messagesModel
/**
* Model payment_methods
*
*/
export type payment_methods = Prisma.payment_methodsModel
/**
* Model professionals
*
*/
export type professionals = Prisma.professionalsModel
/**
* Model professions
*
*/
export type professions = Prisma.professionsModel
/**
* Model regions
*
*/
export type regions = Prisma.regionsModel
/**
* Model reputations
*
*/
export type reputations = Prisma.reputationsModel
/**
* Model schedules
* This table contains check constraints and requires additional setup for migrations. Visit https://pris.ly/d/check-constraints for more info.
*/
export type schedules = Prisma.schedulesModel
/**
* Model services
*
*/
export type services = Prisma.servicesModel
/**
* Model settings
*
*/
export type settings = Prisma.settingsModel
/**
* Model specializations
*
*/
export type specializations = Prisma.specializationsModel
/**
* Model users
*
*/
export type users = Prisma.usersModel
@@ -0,0 +1,733 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports various common sort, input & filter types that are not directly linked to a particular model.
*
* 🟢 You can import this file directly.
*/
import type * as runtime from "@prisma/client/runtime/client"
import * as $Enums from "./enums"
import type * as Prisma from "./internal/prismaNamespace"
export type UuidFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedUuidFilter<$PrismaModel> | string
}
export type DateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type UuidWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type DateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type StringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type DecimalNullableFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
}
export type SortOrderInput = {
sort: Prisma.SortOrder
nulls?: Prisma.NullsOrder
}
export type StringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type DecimalNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_min?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_max?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
}
export type UuidNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedUuidNullableFilter<$PrismaModel> | string | null
}
export type StringNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
}
export type IntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type BoolFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
}
export type UuidNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedUuidNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type StringNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
mode?: Prisma.QueryMode
not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type IntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}
export type BoolWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedBoolFilter<$PrismaModel>
_max?: Prisma.NestedBoolFilter<$PrismaModel>
}
export type BoolNullableFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedBoolNullableFilter<$PrismaModel> | boolean | null
}
export type BoolNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedBoolNullableWithAggregatesFilter<$PrismaModel> | boolean | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedBoolNullableFilter<$PrismaModel>
_max?: Prisma.NestedBoolNullableFilter<$PrismaModel>
}
export type DecimalFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
}
export type DecimalWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalFilter<$PrismaModel>
_min?: Prisma.NestedDecimalFilter<$PrismaModel>
_max?: Prisma.NestedDecimalFilter<$PrismaModel>
}
export type DateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
}
export type DateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type Enumservice_statusFilter<$PrismaModel = never> = {
equals?: $Enums.service_status | Prisma.Enumservice_statusFieldRefInput<$PrismaModel>
in?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
notIn?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumservice_statusFilter<$PrismaModel> | $Enums.service_status
}
export type Enumservice_locationNullableFilter<$PrismaModel = never> = {
equals?: $Enums.service_location | Prisma.Enumservice_locationFieldRefInput<$PrismaModel> | null
in?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
notIn?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel> | $Enums.service_location | null
}
export type Enumservice_statusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.service_status | Prisma.Enumservice_statusFieldRefInput<$PrismaModel>
in?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
notIn?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumservice_statusWithAggregatesFilter<$PrismaModel> | $Enums.service_status
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumservice_statusFilter<$PrismaModel>
_max?: Prisma.NestedEnumservice_statusFilter<$PrismaModel>
}
export type Enumservice_locationNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.service_location | Prisma.Enumservice_locationFieldRefInput<$PrismaModel> | null
in?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
notIn?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedEnumservice_locationNullableWithAggregatesFilter<$PrismaModel> | $Enums.service_location | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel>
_max?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel>
}
export type JsonFilter<$PrismaModel = never> =
| Prisma.PatchUndefined<
Prisma.Either<Required<JsonFilterBase<$PrismaModel>>, Exclude<keyof Required<JsonFilterBase<$PrismaModel>>, 'path'>>,
Required<JsonFilterBase<$PrismaModel>>
>
| Prisma.OptionalFlat<Omit<Required<JsonFilterBase<$PrismaModel>>, 'path'>>
export type JsonFilterBase<$PrismaModel = never> = {
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
path?: string[]
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
}
export type JsonWithAggregatesFilter<$PrismaModel = never> =
| Prisma.PatchUndefined<
Prisma.Either<Required<JsonWithAggregatesFilterBase<$PrismaModel>>, Exclude<keyof Required<JsonWithAggregatesFilterBase<$PrismaModel>>, 'path'>>,
Required<JsonWithAggregatesFilterBase<$PrismaModel>>
>
| Prisma.OptionalFlat<Omit<Required<JsonWithAggregatesFilterBase<$PrismaModel>>, 'path'>>
export type JsonWithAggregatesFilterBase<$PrismaModel = never> = {
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
path?: string[]
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedJsonFilter<$PrismaModel>
_max?: Prisma.NestedJsonFilter<$PrismaModel>
}
export type NestedUuidFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedUuidFilter<$PrismaModel> | string
}
export type NestedDateTimeFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeFilter<$PrismaModel> | Date | string
}
export type NestedUuidWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedUuidWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type NestedIntFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntFilter<$PrismaModel> | number
}
export type NestedStringFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringFilter<$PrismaModel> | string
}
export type NestedDateTimeWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel>
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeWithAggregatesFilter<$PrismaModel> | Date | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeFilter<$PrismaModel>
}
export type NestedDecimalNullableFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
}
export type NestedStringWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel>
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel>
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringWithAggregatesFilter<$PrismaModel> | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedStringFilter<$PrismaModel>
_max?: Prisma.NestedStringFilter<$PrismaModel>
}
export type NestedDecimalNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel> | null
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel> | null
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalNullableWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_min?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
_max?: Prisma.NestedDecimalNullableFilter<$PrismaModel>
}
export type NestedIntNullableFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel> | null
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel> | null
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntNullableFilter<$PrismaModel> | number | null
}
export type NestedUuidNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedUuidNullableFilter<$PrismaModel> | string | null
}
export type NestedStringNullableFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableFilter<$PrismaModel> | string | null
}
export type NestedBoolFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolFilter<$PrismaModel> | boolean
}
export type NestedUuidNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedUuidNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type NestedStringNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: string | Prisma.StringFieldRefInput<$PrismaModel> | null
in?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
notIn?: string[] | Prisma.ListStringFieldRefInput<$PrismaModel> | null
lt?: string | Prisma.StringFieldRefInput<$PrismaModel>
lte?: string | Prisma.StringFieldRefInput<$PrismaModel>
gt?: string | Prisma.StringFieldRefInput<$PrismaModel>
gte?: string | Prisma.StringFieldRefInput<$PrismaModel>
contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
startsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
endsWith?: string | Prisma.StringFieldRefInput<$PrismaModel>
not?: Prisma.NestedStringNullableWithAggregatesFilter<$PrismaModel> | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedStringNullableFilter<$PrismaModel>
_max?: Prisma.NestedStringNullableFilter<$PrismaModel>
}
export type NestedIntWithAggregatesFilter<$PrismaModel = never> = {
equals?: number | Prisma.IntFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListIntFieldRefInput<$PrismaModel>
lt?: number | Prisma.IntFieldRefInput<$PrismaModel>
lte?: number | Prisma.IntFieldRefInput<$PrismaModel>
gt?: number | Prisma.IntFieldRefInput<$PrismaModel>
gte?: number | Prisma.IntFieldRefInput<$PrismaModel>
not?: Prisma.NestedIntWithAggregatesFilter<$PrismaModel> | number
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedFloatFilter<$PrismaModel>
_sum?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedIntFilter<$PrismaModel>
_max?: Prisma.NestedIntFilter<$PrismaModel>
}
export type NestedFloatFilter<$PrismaModel = never> = {
equals?: number | Prisma.FloatFieldRefInput<$PrismaModel>
in?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel>
notIn?: number[] | Prisma.ListFloatFieldRefInput<$PrismaModel>
lt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
lte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gt?: number | Prisma.FloatFieldRefInput<$PrismaModel>
gte?: number | Prisma.FloatFieldRefInput<$PrismaModel>
not?: Prisma.NestedFloatFilter<$PrismaModel> | number
}
export type NestedBoolWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel>
not?: Prisma.NestedBoolWithAggregatesFilter<$PrismaModel> | boolean
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedBoolFilter<$PrismaModel>
_max?: Prisma.NestedBoolFilter<$PrismaModel>
}
export type NestedBoolNullableFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedBoolNullableFilter<$PrismaModel> | boolean | null
}
export type NestedBoolNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: boolean | Prisma.BooleanFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedBoolNullableWithAggregatesFilter<$PrismaModel> | boolean | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedBoolNullableFilter<$PrismaModel>
_max?: Prisma.NestedBoolNullableFilter<$PrismaModel>
}
export type NestedDecimalFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
}
export type NestedDecimalWithAggregatesFilter<$PrismaModel = never> = {
equals?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
in?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
notIn?: runtime.Decimal[] | runtime.DecimalJsLike[] | number[] | string[] | Prisma.ListDecimalFieldRefInput<$PrismaModel>
lt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
lte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gt?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
gte?: runtime.Decimal | runtime.DecimalJsLike | number | string | Prisma.DecimalFieldRefInput<$PrismaModel>
not?: Prisma.NestedDecimalWithAggregatesFilter<$PrismaModel> | runtime.Decimal | runtime.DecimalJsLike | number | string
_count?: Prisma.NestedIntFilter<$PrismaModel>
_avg?: Prisma.NestedDecimalFilter<$PrismaModel>
_sum?: Prisma.NestedDecimalFilter<$PrismaModel>
_min?: Prisma.NestedDecimalFilter<$PrismaModel>
_max?: Prisma.NestedDecimalFilter<$PrismaModel>
}
export type NestedDateTimeNullableFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableFilter<$PrismaModel> | Date | string | null
}
export type NestedDateTimeNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel> | null
in?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
notIn?: Date[] | string[] | Prisma.ListDateTimeFieldRefInput<$PrismaModel> | null
lt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
lte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gt?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
gte?: Date | string | Prisma.DateTimeFieldRefInput<$PrismaModel>
not?: Prisma.NestedDateTimeNullableWithAggregatesFilter<$PrismaModel> | Date | string | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
_max?: Prisma.NestedDateTimeNullableFilter<$PrismaModel>
}
export type NestedEnumservice_statusFilter<$PrismaModel = never> = {
equals?: $Enums.service_status | Prisma.Enumservice_statusFieldRefInput<$PrismaModel>
in?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
notIn?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumservice_statusFilter<$PrismaModel> | $Enums.service_status
}
export type NestedEnumservice_locationNullableFilter<$PrismaModel = never> = {
equals?: $Enums.service_location | Prisma.Enumservice_locationFieldRefInput<$PrismaModel> | null
in?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
notIn?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel> | $Enums.service_location | null
}
export type NestedEnumservice_statusWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.service_status | Prisma.Enumservice_statusFieldRefInput<$PrismaModel>
in?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
notIn?: $Enums.service_status[] | Prisma.ListEnumservice_statusFieldRefInput<$PrismaModel>
not?: Prisma.NestedEnumservice_statusWithAggregatesFilter<$PrismaModel> | $Enums.service_status
_count?: Prisma.NestedIntFilter<$PrismaModel>
_min?: Prisma.NestedEnumservice_statusFilter<$PrismaModel>
_max?: Prisma.NestedEnumservice_statusFilter<$PrismaModel>
}
export type NestedEnumservice_locationNullableWithAggregatesFilter<$PrismaModel = never> = {
equals?: $Enums.service_location | Prisma.Enumservice_locationFieldRefInput<$PrismaModel> | null
in?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
notIn?: $Enums.service_location[] | Prisma.ListEnumservice_locationFieldRefInput<$PrismaModel> | null
not?: Prisma.NestedEnumservice_locationNullableWithAggregatesFilter<$PrismaModel> | $Enums.service_location | null
_count?: Prisma.NestedIntNullableFilter<$PrismaModel>
_min?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel>
_max?: Prisma.NestedEnumservice_locationNullableFilter<$PrismaModel>
}
export type NestedJsonFilter<$PrismaModel = never> =
| Prisma.PatchUndefined<
Prisma.Either<Required<NestedJsonFilterBase<$PrismaModel>>, Exclude<keyof Required<NestedJsonFilterBase<$PrismaModel>>, 'path'>>,
Required<NestedJsonFilterBase<$PrismaModel>>
>
| Prisma.OptionalFlat<Omit<Required<NestedJsonFilterBase<$PrismaModel>>, 'path'>>
export type NestedJsonFilterBase<$PrismaModel = never> = {
equals?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
path?: string[]
mode?: Prisma.QueryMode | Prisma.EnumQueryModeFieldRefInput<$PrismaModel>
string_contains?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_starts_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
string_ends_with?: string | Prisma.StringFieldRefInput<$PrismaModel>
array_starts_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_ends_with?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
array_contains?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | null
lt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
lte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gt?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
gte?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel>
not?: runtime.InputJsonValue | Prisma.JsonFieldRefInput<$PrismaModel> | Prisma.JsonNullValueFilter
}
+30
View File
@@ -0,0 +1,30 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This file exports all enum related types from the schema.
*
* 🟢 You can import this file directly.
*/
export const service_location = {
office: 'office',
delivery: 'delivery'
} as const
export type service_location = (typeof service_location)[keyof typeof service_location]
export const service_status = {
pending: 'pending',
accepted: 'accepted',
denied: 'denied',
active: 'active',
cancelled: 'cancelled',
completed: 'completed',
self_booked: 'self_booked'
} as const
export type service_status = (typeof service_status)[keyof typeof service_status]
File diff suppressed because one or more lines are too long
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,323 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* WARNING: This is an internal file that is subject to change!
*
* 🛑 Under no circumstances should you import this file directly! 🛑
*
* All exports from this file are wrapped under a `Prisma` namespace object in the browser.ts file.
* While this enables partial backward compatibility, it is not part of the stable public API.
*
* If you are looking for your Models, Enums, and Input Types, please import them from the respective
* model files in the `model` directory!
*/
import * as runtime from "@prisma/client/runtime/index-browser"
export type * from '../models'
export type * from './prismaNamespace'
export const Decimal = runtime.Decimal
export const NullTypes = {
DbNull: runtime.NullTypes.DbNull as (new (secret: never) => typeof runtime.DbNull),
JsonNull: runtime.NullTypes.JsonNull as (new (secret: never) => typeof runtime.JsonNull),
AnyNull: runtime.NullTypes.AnyNull as (new (secret: never) => typeof runtime.AnyNull),
}
/**
* Helper for filtering JSON entries that have `null` on the database (empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const DbNull = runtime.DbNull
/**
* Helper for filtering JSON entries that have JSON `null` values (not empty on the db)
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const JsonNull = runtime.JsonNull
/**
* Helper for filtering JSON entries that are `Prisma.DbNull` or `Prisma.JsonNull`
*
* @see https://www.prisma.io/docs/concepts/components/prisma-client/working-with-fields/working-with-json-fields#filtering-on-a-json-field
*/
export const AnyNull = runtime.AnyNull
export const ModelName = {
chats: 'chats',
cities: 'cities',
comments: 'comments',
countries: 'countries',
messages: 'messages',
payment_methods: 'payment_methods',
professionals: 'professionals',
professions: 'professions',
regions: 'regions',
reputations: 'reputations',
schedules: 'schedules',
services: 'services',
settings: 'settings',
specializations: 'specializations',
users: 'users'
} as const
export type ModelName = (typeof ModelName)[keyof typeof ModelName]
/*
* Enums
*/
export const TransactionIsolationLevel = runtime.makeStrictEnum({
ReadUncommitted: 'ReadUncommitted',
ReadCommitted: 'ReadCommitted',
RepeatableRead: 'RepeatableRead',
Serializable: 'Serializable'
} as const)
export type TransactionIsolationLevel = (typeof TransactionIsolationLevel)[keyof typeof TransactionIsolationLevel]
export const ChatsScalarFieldEnum = {
id: 'id',
user_id: 'user_id',
professional_id: 'professional_id',
created_at: 'created_at'
} as const
export type ChatsScalarFieldEnum = (typeof ChatsScalarFieldEnum)[keyof typeof ChatsScalarFieldEnum]
export const CitiesScalarFieldEnum = {
id: 'id',
region_id: 'region_id',
name: 'name',
latitude: 'latitude',
longitude: 'longitude'
} as const
export type CitiesScalarFieldEnum = (typeof CitiesScalarFieldEnum)[keyof typeof CitiesScalarFieldEnum]
export const CommentsScalarFieldEnum = {
id: 'id',
author_id: 'author_id',
destination_id: 'destination_id',
service_id: 'service_id',
content: 'content',
score: 'score',
is_from_user: 'is_from_user',
created_at: 'created_at'
} as const
export type CommentsScalarFieldEnum = (typeof CommentsScalarFieldEnum)[keyof typeof CommentsScalarFieldEnum]
export const CountriesScalarFieldEnum = {
id: 'id',
name: 'name'
} as const
export type CountriesScalarFieldEnum = (typeof CountriesScalarFieldEnum)[keyof typeof CountriesScalarFieldEnum]
export const MessagesScalarFieldEnum = {
id: 'id',
chat_id: 'chat_id',
sender_id: 'sender_id',
content: 'content',
created_at: 'created_at'
} as const
export type MessagesScalarFieldEnum = (typeof MessagesScalarFieldEnum)[keyof typeof MessagesScalarFieldEnum]
export const Payment_methodsScalarFieldEnum = {
id: 'id',
professional_id: 'professional_id',
nequi: 'nequi',
datafono: 'datafono',
transferencia: 'transferencia'
} as const
export type Payment_methodsScalarFieldEnum = (typeof Payment_methodsScalarFieldEnum)[keyof typeof Payment_methodsScalarFieldEnum]
export const ProfessionalsScalarFieldEnum = {
id: 'id',
user_id: 'user_id',
identification: 'identification',
address: 'address',
additional_address: 'additional_address',
profession: 'profession',
rate: 'rate',
rate_preferences: 'rate_preferences',
location_preferences: 'location_preferences',
banner_picture: 'banner_picture',
identification_picture: 'identification_picture',
certificate_picture: 'certificate_picture',
latitude: 'latitude',
longitude: 'longitude',
average_score: 'average_score',
is_active: 'is_active',
created_at: 'created_at',
updated_at: 'updated_at'
} as const
export type ProfessionalsScalarFieldEnum = (typeof ProfessionalsScalarFieldEnum)[keyof typeof ProfessionalsScalarFieldEnum]
export const ProfessionsScalarFieldEnum = {
id: 'id',
name: 'name'
} as const
export type ProfessionsScalarFieldEnum = (typeof ProfessionsScalarFieldEnum)[keyof typeof ProfessionsScalarFieldEnum]
export const RegionsScalarFieldEnum = {
id: 'id',
country_id: 'country_id',
name: 'name'
} as const
export type RegionsScalarFieldEnum = (typeof RegionsScalarFieldEnum)[keyof typeof RegionsScalarFieldEnum]
export const ReputationsScalarFieldEnum = {
user_id: 'user_id',
total: 'total',
average: 'average',
total_pro: 'total_pro',
average_pro: 'average_pro',
updated_at: 'updated_at'
} as const
export type ReputationsScalarFieldEnum = (typeof ReputationsScalarFieldEnum)[keyof typeof ReputationsScalarFieldEnum]
export const SchedulesScalarFieldEnum = {
id: 'id',
professional_id: 'professional_id',
day_of_week: 'day_of_week',
enabled: 'enabled',
continuous_day: 'continuous_day',
range1_hour1: 'range1_hour1',
range1_hour2: 'range1_hour2',
range2_hour1: 'range2_hour1',
range2_hour2: 'range2_hour2'
} as const
export type SchedulesScalarFieldEnum = (typeof SchedulesScalarFieldEnum)[keyof typeof SchedulesScalarFieldEnum]
export const ServicesScalarFieldEnum = {
id: 'id',
professional_id: 'professional_id',
user_id: 'user_id',
address: 'address',
additional_address: 'additional_address',
latitude: 'latitude',
longitude: 'longitude',
day: 'day',
description: 'description',
rate: 'rate',
range1_hour1: 'range1_hour1',
range1_hour2: 'range1_hour2',
status: 'status',
location_preference: 'location_preference',
professional_scored: 'professional_scored',
user_scored: 'user_scored',
created_at: 'created_at',
updated_at: 'updated_at'
} as const
export type ServicesScalarFieldEnum = (typeof ServicesScalarFieldEnum)[keyof typeof ServicesScalarFieldEnum]
export const SettingsScalarFieldEnum = {
key: 'key',
value: 'value',
updated_at: 'updated_at'
} as const
export type SettingsScalarFieldEnum = (typeof SettingsScalarFieldEnum)[keyof typeof SettingsScalarFieldEnum]
export const SpecializationsScalarFieldEnum = {
id: 'id',
professional_id: 'professional_id',
name: 'name',
picture: 'picture'
} as const
export type SpecializationsScalarFieldEnum = (typeof SpecializationsScalarFieldEnum)[keyof typeof SpecializationsScalarFieldEnum]
export const UsersScalarFieldEnum = {
id: 'id',
email: 'email',
phone: 'phone',
password_hash: 'password_hash',
name: 'name',
nickname: 'nickname',
city: 'city',
picture: 'picture',
birthday: 'birthday',
gender: 'gender',
pro_state: 'pro_state',
fcm_token: 'fcm_token',
is_phone_verified: 'is_phone_verified',
is_email_verified: 'is_email_verified',
created_at: 'created_at',
updated_at: 'updated_at'
} as const
export type UsersScalarFieldEnum = (typeof UsersScalarFieldEnum)[keyof typeof UsersScalarFieldEnum]
export const SortOrder = {
asc: 'asc',
desc: 'desc'
} as const
export type SortOrder = (typeof SortOrder)[keyof typeof SortOrder]
export const JsonNullValueInput = {
JsonNull: JsonNull
} as const
export type JsonNullValueInput = (typeof JsonNullValueInput)[keyof typeof JsonNullValueInput]
export const QueryMode = {
default: 'default',
insensitive: 'insensitive'
} as const
export type QueryMode = (typeof QueryMode)[keyof typeof QueryMode]
export const NullsOrder = {
first: 'first',
last: 'last'
} as const
export type NullsOrder = (typeof NullsOrder)[keyof typeof NullsOrder]
export const JsonNullValueFilter = {
DbNull: DbNull,
JsonNull: JsonNull,
AnyNull: AnyNull
} as const
export type JsonNullValueFilter = (typeof JsonNullValueFilter)[keyof typeof JsonNullValueFilter]
+26
View File
@@ -0,0 +1,26 @@
/* !!! This is code generated by Prisma. Do not edit directly. !!! */
/* eslint-disable */
// biome-ignore-all lint: generated file
// @ts-nocheck
/*
* This is a barrel export file for all models and their related types.
*
* 🟢 You can import this file directly.
*/
export type * from './models/chats'
export type * from './models/cities'
export type * from './models/comments'
export type * from './models/countries'
export type * from './models/messages'
export type * from './models/payment_methods'
export type * from './models/professionals'
export type * from './models/professions'
export type * from './models/regions'
export type * from './models/reputations'
export type * from './models/schedules'
export type * from './models/services'
export type * from './models/settings'
export type * from './models/specializations'
export type * from './models/users'
export type * from './commonInputTypes'
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
File diff suppressed because it is too large Load Diff
@@ -0,0 +1,24 @@
import { Controller, Get, Param } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { LocationsService } from './locations.service';
@ApiTags('Locations')
@Controller('locations')
export class LocationsController {
constructor(private locations: LocationsService) {}
@Get('countries')
getCountries() {
return this.locations.getCountries();
}
@Get('countries/:countryId/regions')
getRegions(@Param('countryId') id: string) {
return this.locations.getRegions(id);
}
@Get('regions/:regionId/cities')
getCities(@Param('regionId') id: string) {
return this.locations.getCities(id);
}
}
@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { LocationsService } from './locations.service';
import { LocationsController } from './locations.controller';
@Module({
providers: [LocationsService],
controllers: [LocationsController],
})
export class LocationsModule {}
@@ -0,0 +1,19 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class LocationsService {
constructor(private prisma: PrismaService) {}
getCountries() {
return this.prisma.countries.findMany({ include: { regions: { include: { cities: true } } } });
}
getRegions(countryId: string) {
return this.prisma.regions.findMany({ where: { country_id: countryId }, include: { cities: true } });
}
getCities(regionId: string) {
return this.prisma.cities.findMany({ where: { region_id: regionId } });
}
}
+33
View File
@@ -0,0 +1,33 @@
import { NestFactory } from '@nestjs/core';
import { ValidationPipe, Logger } from '@nestjs/common';
import { SwaggerModule, DocumentBuilder } from '@nestjs/swagger';
import { AppModule } from './app.module';
async function bootstrap() {
const app = await NestFactory.create(AppModule);
const logger = new Logger('Bootstrap');
app.enableCors({
origin: ['http://localhost:3000', 'http://localhost:5173', 'https://app.prosapp.co'],
methods: ['GET', 'POST', 'PUT', 'PATCH', 'DELETE'],
credentials: true,
});
app.setGlobalPrefix('api/v1');
app.useGlobalPipes(new ValidationPipe({ whitelist: true, transform: true }));
const config = new DocumentBuilder()
.setTitle('ProsApp API')
.setDescription('API de ProsApp - Migración Firebase a PostgreSQL')
.setVersion('1.0')
.addBearerAuth()
.build();
const document = SwaggerModule.createDocument(app, config);
SwaggerModule.setup('docs', app, document);
const port = process.env.PORT || 3000;
await app.listen(port);
logger.log(`API corriendo en http://localhost:${port}`);
logger.log(`Swagger en http://localhost:${port}/docs`);
}
bootstrap();
+9
View File
@@ -0,0 +1,9 @@
import { Global, Module } from '@nestjs/common';
import { PrismaService } from './prisma.service';
@Global()
@Module({
providers: [PrismaService],
exports: [PrismaService],
})
export class PrismaModule {}
+13
View File
@@ -0,0 +1,13 @@
import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common';
import { PrismaClient } from '@prisma/client';
@Injectable()
export class PrismaService extends PrismaClient implements OnModuleInit, OnModuleDestroy {
async onModuleInit() {
await this.$connect();
}
async onModuleDestroy() {
await this.$disconnect();
}
}
@@ -0,0 +1,48 @@
import { Controller, Get, Post, Patch, Param, Body, UseGuards, Req, Query } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { ProfessionalsService } from './professionals.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
@ApiTags('Professionals')
@Controller('professionals')
export class ProfessionalsController {
constructor(private pros: ProfessionalsService) {}
@Get()
findAllActive() {
return this.pros.findAllActive();
}
@Get('me')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findByMe(@Req() req) {
return this.pros.findByUserId(req.user.sub);
}
@Get(':id')
findById(@Param('id') id: string) {
return this.pros.findById(id);
}
@Post('request')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
request(@Req() req, @Body() data: any) {
return this.pros.requestProfessional(req.user.sub, data);
}
@Patch('me')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
update(@Req() req, @Body() data: any) {
return this.pros.upsert(req.user.sub, data);
}
@Patch('me/schedules')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
updateSchedules(@Req() req, @Body() data: { schedules: any[] }) {
return this.pros.updateSchedules(req.user.sub, data.schedules);
}
}
@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { ProfessionalsService } from './professionals.service';
import { ProfessionalsController } from './professionals.controller';
@Module({
providers: [ProfessionalsService],
controllers: [ProfessionalsController],
exports: [ProfessionalsService],
})
export class ProfessionalsModule {}
@@ -0,0 +1,80 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class ProfessionalsService {
constructor(private prisma: PrismaService) {}
findAllActive() {
return this.prisma.professionals.findMany({
where: { is_active: true },
include: {
users: { select: { id: true, name: true, picture: true, city: true } },
schedules: true,
specializations: true,
payment_methods: true,
},
});
}
findById(id: string) {
return this.prisma.professionals.findUnique({
where: { id },
include: {
users: { select: { id: true, name: true, picture: true, city: true } },
schedules: { orderBy: { day_of_week: 'asc' } },
specializations: true,
payment_methods: true,
},
});
}
findByUserId(userId: string) {
return this.prisma.professionals.findUnique({
where: { user_id: userId },
include: { schedules: true, specializations: true, payment_methods: true },
});
}
async upsert(userId: string, data: any) {
const existing = await this.prisma.professionals.findUnique({ where: { user_id: userId } });
if (existing) {
return this.prisma.professionals.update({ where: { user_id: userId }, data });
}
return this.prisma.professionals.create({ data: { ...data, user_id: userId } });
}
async updateSchedules(professionalId: string, schedules: any[]) {
await this.prisma.schedules.deleteMany({ where: { professional_id: professionalId } });
return this.prisma.schedules.createMany({
data: schedules.map((s: any) => ({
professional_id: professionalId,
day_of_week: s.day_of_week,
enabled: s.enabled,
continuous_day: s.continuous_day,
range1_hour1: s.range1_hour1,
range1_hour2: s.range1_hour2,
range2_hour1: s.range2_hour1,
range2_hour2: s.range2_hour2,
})),
});
}
async requestProfessional(userId: string, data: any) {
const existing = await this.prisma.professionals.findUnique({ where: { user_id: userId } });
if (existing) throw new Error('Ya tienes una solicitud de profesional');
await this.prisma.users.update({ where: { id: userId }, data: { pro_state: 1 } });
return this.prisma.professionals.create({
data: {
user_id: userId,
identification: data.identification,
profession: data.profession,
address: data.address,
identification_picture: data.identification_picture,
certificate_picture: data.certificate_picture,
},
});
}
}
@@ -0,0 +1,14 @@
import { Controller, Get } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { ProfessionsService } from './professions.service';
@ApiTags('Professions')
@Controller('professions')
export class ProfessionsController {
constructor(private professions: ProfessionsService) {}
@Get()
findAll() {
return this.professions.findAll();
}
}
@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { ProfessionsService } from './professions.service';
import { ProfessionsController } from './professions.controller';
@Module({
providers: [ProfessionsService],
controllers: [ProfessionsController],
})
export class ProfessionsModule {}
@@ -0,0 +1,11 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class ProfessionsService {
constructor(private prisma: PrismaService) {}
findAll() {
return this.prisma.professions.findMany({ orderBy: { name: 'asc' } });
}
}
@@ -0,0 +1,78 @@
import { Controller, Get, Post, Patch, Param, Body, UseGuards, Req } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { ServicesService } from './services.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
@ApiTags('Services')
@Controller('services')
export class ServicesController {
constructor(private services: ServicesService) {}
@Post()
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
create(@Req() req, @Body() data: any) {
return this.services.create({ ...data, user_id: req.user.sub });
}
@Get('me')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findByMe(@Req() req) {
return this.services.findByUser(req.user.sub);
}
@Get('professional')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findByProfessional(@Req() req) {
return this.services.findByProfessional(req.user.sub);
}
@Get('professional/requests')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
requestsByProfessional(@Req() req) {
return this.services.findRequestsByProfessional(req.user.sub);
}
@Get('professional/history')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
historyByProfessional(@Req() req) {
return this.services.getHistoryByProfessional(req.user.sub);
}
@Get('me/history')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
historyByUser(@Req() req) {
return this.services.getHistoryByUser(req.user.sub);
}
@Get('professional/calendar')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
calendarByProfessional(@Req() req) {
return this.services.getCalendarByProfessional(req.user.sub);
}
@Get('public-calendar/:professionalId')
getPublicCalendar(@Param('professionalId') id: string) {
return this.services.getPublicCalendar(id);
}
@Get(':id')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findById(@Param('id') id: string) {
return this.services.findById(id);
}
@Patch(':id/status')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
updateStatus(@Param('id') id: string, @Body() dto: { status: string }) {
return this.services.updateStatus(id, dto.status);
}
}
+10
View File
@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { ServicesService } from './services.service';
import { ServicesController } from './services.controller';
@Module({
providers: [ServicesService],
controllers: [ServicesController],
exports: [ServicesService],
})
export class ServicesModule {}
+94
View File
@@ -0,0 +1,94 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class ServicesService {
constructor(private prisma: PrismaService) {}
create(data: {
professional_id: string;
user_id: string;
day: string;
description?: string;
rate?: number;
range1_hour1?: string;
range1_hour2?: string;
address?: string;
latitude?: number;
longitude?: number;
location_preference?: 'office' | 'delivery';
}) {
return this.prisma.services.create({ data: { ...data, day: new Date(data.day) } as any });
}
findByUser(userId: string) {
return this.prisma.services.findMany({
where: { user_id: userId },
include: { professionals: { include: { users: true } } },
orderBy: { created_at: 'desc' },
});
}
findByProfessional(professionalId: string) {
return this.prisma.services.findMany({
where: { professional_id: professionalId },
include: { users: { select: { id: true, name: true, picture: true, phone: true } } },
orderBy: { created_at: 'desc' },
});
}
findRequestsByProfessional(professionalId: string) {
return this.prisma.services.findMany({
where: { professional_id: professionalId, status: 'pending' },
include: { users: { select: { id: true, name: true, picture: true, phone: true } } },
orderBy: { created_at: 'desc' },
});
}
updateStatus(id: string, status: string) {
return this.prisma.services.update({ where: { id }, data: { status: status as any } });
}
findById(id: string) {
return this.prisma.services.findUnique({
where: { id },
include: {
users: { select: { id: true, name: true, picture: true, phone: true } },
professionals: { include: { users: true } },
},
});
}
getHistoryByUser(userId: string) {
return this.prisma.services.findMany({
where: { user_id: userId, status: { in: ['completed', 'cancelled'] } },
include: { professionals: { include: { users: true } } },
orderBy: { day: 'desc' },
});
}
getHistoryByProfessional(professionalId: string) {
return this.prisma.services.findMany({
where: { professional_id: professionalId, status: { in: ['completed', 'cancelled'] } },
include: { users: { select: { id: true, name: true, picture: true } } },
orderBy: { day: 'desc' },
});
}
getCalendarByProfessional(professionalId: string) {
return this.prisma.services.findMany({
where: { professional_id: professionalId, status: { notIn: ['denied', 'cancelled'] } },
orderBy: { day: 'asc' },
});
}
async getPublicCalendar(professionalId: string) {
const schedules = await this.prisma.schedules.findMany({
where: { professional_id: professionalId, enabled: true },
});
const services = await this.prisma.services.findMany({
where: { professional_id: professionalId, status: { notIn: ['denied', 'cancelled'] } },
});
return { schedules, services };
}
}
@@ -0,0 +1,14 @@
import { Controller, Get } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { SettingsService } from './settings.service';
@ApiTags('Settings')
@Controller('settings')
export class SettingsController {
constructor(private settings: SettingsService) {}
@Get()
getGlobal() {
return this.settings.getGlobal();
}
}
+9
View File
@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { SettingsService } from './settings.service';
import { SettingsController } from './settings.controller';
@Module({
providers: [SettingsService],
controllers: [SettingsController],
})
export class SettingsModule {}
+12
View File
@@ -0,0 +1,12 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class SettingsService {
constructor(private prisma: PrismaService) {}
async getGlobal() {
const setting = await this.prisma.settings.findUnique({ where: { key: 'global' } });
return setting?.value;
}
}
+19
View File
@@ -0,0 +1,19 @@
import { Controller, Post, UseGuards, Req, UploadedFile, UseInterceptors } from '@nestjs/common';
import { FileInterceptor } from '@nestjs/platform-express';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
import { StorageService } from './storage.service';
@ApiTags('Storage')
@Controller('storage')
export class StorageController {
constructor(private storage: StorageService) {}
@Post('upload')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
@UseInterceptors(FileInterceptor('file'))
upload(@UploadedFile() file: any) {
return { url: this.storage.getUploadUrl(file?.originalname) };
}
}
+9
View File
@@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { StorageService } from './storage.service';
import { StorageController } from './storage.controller';
@Module({
providers: [StorageService],
controllers: [StorageController],
})
export class StorageModule {}
+14
View File
@@ -0,0 +1,14 @@
import { Injectable } from '@nestjs/common';
@Injectable()
export class StorageService {
private baseUrl: string;
constructor() {
this.baseUrl = process.env.STORAGE_URL || 'http://localhost:9000';
}
getUploadUrl(fileName: string) {
return `${this.baseUrl}/uploads/${fileName}`;
}
}
+38
View File
@@ -0,0 +1,38 @@
import { Controller, Get, Patch, Param, Body, UseGuards, Req } from '@nestjs/common';
import { ApiTags, ApiBearerAuth } from '@nestjs/swagger';
import { UsersService } from './users.service';
import { JwtAuthGuard } from '../auth/jwt-auth.guard';
@ApiTags('Users')
@Controller('users')
export class UsersController {
constructor(private users: UsersService) {}
@Get()
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findAll() {
return this.users.findAll();
}
@Get(':id')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
findById(@Param('id') id: string) {
return this.users.findById(id);
}
@Patch('me')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
update(@Req() req, @Body() data: any) {
return this.users.update(req.user.sub, data);
}
@Patch('fcm-token')
@UseGuards(JwtAuthGuard)
@ApiBearerAuth()
updateFcmToken(@Req() req, @Body() dto: { token: string }) {
return this.users.updateFcmToken(req.user.sub, dto.token);
}
}
+10
View File
@@ -0,0 +1,10 @@
import { Module } from '@nestjs/common';
import { UsersService } from './users.service';
import { UsersController } from './users.controller';
@Module({
providers: [UsersService],
controllers: [UsersController],
exports: [UsersService],
})
export class UsersModule {}
+29
View File
@@ -0,0 +1,29 @@
import { Injectable } from '@nestjs/common';
import { PrismaService } from '../prisma/prisma.service';
@Injectable()
export class UsersService {
constructor(private prisma: PrismaService) {}
findAll() {
return this.prisma.users.findMany({ orderBy: { created_at: 'desc' } });
}
findById(id: string) {
return this.prisma.users.findUnique({
where: { id },
include: {
professionals: { include: { schedules: true, specializations: true } },
reputations: true,
},
});
}
update(id: string, data: any) {
return this.prisma.users.update({ where: { id }, data });
}
updateFcmToken(id: string, fcm_token: string) {
return this.prisma.users.update({ where: { id }, data: { fcm_token } });
}
}
+22
View File
@@ -0,0 +1,22 @@
{
"compilerOptions": {
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"target": "ES2021",
"sourceMap": true,
"outDir": "./dist",
"rootDir": "./src",
"incremental": true,
"skipLibCheck": true,
"strictNullChecks": true,
"noImplicitAny": false,
"strictBindCallApply": false,
"forceConsistentCasingInFileNames": false,
"noFallthroughCasesInSwitch": false,
"include": ["src/**/*"],
"exclude": ["node_modules", "dist", "prisma", "prisma.config.ts"]
}
File diff suppressed because one or more lines are too long