diff --git a/apps/api/src/config/exception-to-http.pipe.ts b/apps/api/src/config/exception-to-http.pipe.ts index 0dfb355..fb10335 100644 --- a/apps/api/src/config/exception-to-http.pipe.ts +++ b/apps/api/src/config/exception-to-http.pipe.ts @@ -4,7 +4,15 @@ import { EntityNotFoundError, } from "@cv/core"; import { - type ArgumentsHost, Catch, ConflictException, ExceptionFilter, ForbiddenException, Logger, NotFoundException, UnauthorizedException, } from "@nestjs/common"; + type ArgumentsHost, + Catch, + ConflictException, + ExceptionFilter, + ForbiddenException, + Logger, + NotFoundException, + UnauthorizedException, +} from "@nestjs/common"; import { DomainError } from "@/domain/errors/app-error"; import { EntityAlreadyExistsError } from "@/domain/errors/conflict.error"; diff --git a/apps/api/src/config/file-storage.config.ts b/apps/api/src/config/file-storage.config.ts index 956114c..0c87432 100644 --- a/apps/api/src/config/file-storage.config.ts +++ b/apps/api/src/config/file-storage.config.ts @@ -1,4 +1,7 @@ -import { FileStorageConfigProvider, FileStorageModuleConfig } from "@cv/file-storage"; +import { + FileStorageConfigProvider, + FileStorageModuleConfig, +} from "@cv/file-storage"; import { Injectable } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; import { Env } from "./env.validation"; diff --git a/apps/api/src/modules/admin/admin.resolver.ts b/apps/api/src/modules/admin/admin.resolver.ts index b7055f4..120edf6 100644 --- a/apps/api/src/modules/admin/admin.resolver.ts +++ b/apps/api/src/modules/admin/admin.resolver.ts @@ -1,5 +1,8 @@ import { - AI_PROVIDER, AIProvider, registeredProviderTypes, } from "@cv/ai-provider"; + AI_PROVIDER, + AIProvider, + registeredProviderTypes, +} from "@cv/ai-provider"; import { AdminGuard, JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; import { PageInfo } from "@cv/core"; import { Inject, Optional, UseGuards } from "@nestjs/common"; diff --git a/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts b/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts index 5680028..2a043ff 100644 --- a/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts +++ b/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts @@ -1,7 +1,27 @@ import { AdminGuard, JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { NamedEntity } from "@cv/core"; import { - ApplicationStatus, ApplicationStatusService, ClockService, Company, CompanyService, Institution, InstitutionService, JobType, JobTypeService, Level, LevelService, Organization, OrganizationRole, OrganizationRoleService, OrganizationService, Role, RoleService, Skill, SkillService, UuidFactoryService, } from "@cv/core"; + ApplicationStatus, + ApplicationStatusService, + ClockService, + Company, + CompanyService, + Institution, + InstitutionService, + JobType, + JobTypeService, + Level, + LevelService, + NamedEntity, + Organization, + OrganizationRole, + OrganizationRoleService, + OrganizationService, + Role, + RoleService, + Skill, + SkillService, + UuidFactoryService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { AdminEntityType, AdminLookupEntity } from "./admin-lookup.type"; diff --git a/apps/api/src/modules/admin/logging-ai-provider.ts b/apps/api/src/modules/admin/logging-ai-provider.ts index e5f2bea..8ef70ea 100644 --- a/apps/api/src/modules/admin/logging-ai-provider.ts +++ b/apps/api/src/modules/admin/logging-ai-provider.ts @@ -1,5 +1,10 @@ import { randomUUID } from "node:crypto"; -import { AICompletionRequest, AICompletionResponse, AIProvider, AIProviderStatus } from "@cv/ai-provider"; +import { + AICompletionRequest, + AICompletionResponse, + AIProvider, + AIProviderStatus, +} from "@cv/ai-provider"; import { ClockService } from "@cv/core"; import { AiCallLogService } from "./ai-call-log.service"; diff --git a/apps/api/src/modules/application/application.module.ts b/apps/api/src/modules/application/application.module.ts index f79c44b..7d31c47 100644 --- a/apps/api/src/modules/application/application.module.ts +++ b/apps/api/src/modules/application/application.module.ts @@ -1,9 +1,10 @@ import { AuthModule } from "@cv/auth"; -import { BaseModule, +import { ApplicationMapper, ApplicationPolicy, ApplicationService, AuthorizationModule, + BaseModule, DatabaseModule, } from "@cv/core"; import { Module } from "@nestjs/common"; @@ -15,7 +16,8 @@ import { ApplicationResolver } from "./graphql/application.resolver"; import { ApplicationUserFieldResolver } from "./graphql/user-field.resolver"; @Module({ - imports: [BaseModule, + imports: [ + BaseModule, DatabaseModule, AuthenticationModule, AuthorizationModule, diff --git a/apps/api/src/modules/application/graphql/application.resolver.ts b/apps/api/src/modules/application/graphql/application.resolver.ts index 5490084..76dca00 100644 --- a/apps/api/src/modules/application/graphql/application.resolver.ts +++ b/apps/api/src/modules/application/graphql/application.resolver.ts @@ -1,7 +1,13 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser } from "@cv/core"; import { - Application as ApplicationEntity, ApplicationMapper, ApplicationService, AuthorizationService, PrismaService, } from "@cv/core"; + Application as ApplicationEntity, + ApplicationMapper, + ApplicationService, + AuthorizationService, + ClockService, + User as DomainUser, + PrismaService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, diff --git a/apps/api/src/modules/application/graphql/user-field.resolver.ts b/apps/api/src/modules/application/graphql/user-field.resolver.ts index 126b775..f859a52 100644 --- a/apps/api/src/modules/application/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/application/graphql/user-field.resolver.ts @@ -1,5 +1,5 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ApplicationService, PageInfo } from "@cv/core"; +import { ApplicationService, PageInfo } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; diff --git a/apps/api/src/modules/authentication/providers/password/graphql/password-authentication.resolver.ts b/apps/api/src/modules/authentication/providers/password/graphql/password-authentication.resolver.ts index 8c2c31a..02e6a14 100644 --- a/apps/api/src/modules/authentication/providers/password/graphql/password-authentication.resolver.ts +++ b/apps/api/src/modules/authentication/providers/password/graphql/password-authentication.resolver.ts @@ -1,6 +1,12 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; import { - AuthCookieService, AuthorizationService, ClockService, User as DomainUser, PasswordAuthenticationService, RequestMetadata, } from "@cv/core"; + AuthCookieService, + AuthorizationService, + ClockService, + User as DomainUser, + PasswordAuthenticationService, + RequestMetadata, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Context, Mutation, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; @@ -172,5 +178,3 @@ export class PasswordAuthenticationResolver { ); } } - - diff --git a/apps/api/src/modules/authentication/providers/password/password-provider.module.ts b/apps/api/src/modules/authentication/providers/password/password-provider.module.ts index 1fb5009..05d5bbc 100644 --- a/apps/api/src/modules/authentication/providers/password/password-provider.module.ts +++ b/apps/api/src/modules/authentication/providers/password/password-provider.module.ts @@ -1,6 +1,6 @@ import { - BaseModule, PasswordProviderModule as AuthPasswordProviderModule, + BaseModule, EMAIL_CONFIG_TOKEN, EmailConfig, PasswordResetEmailListener, diff --git a/apps/api/src/modules/authentication/rest/authentication.controller.ts b/apps/api/src/modules/authentication/rest/authentication.controller.ts index d67439f..c91a184 100644 --- a/apps/api/src/modules/authentication/rest/authentication.controller.ts +++ b/apps/api/src/modules/authentication/rest/authentication.controller.ts @@ -1,5 +1,9 @@ import { - AuthCookieService, AuthenticationService, ClockService, RequestMetadata, } from "@cv/core"; + AuthCookieService, + AuthenticationService, + ClockService, + RequestMetadata, +} from "@cv/core"; import { Controller, Post, Res } from "@nestjs/common"; import type { Response } from "express"; import { RefreshTokenCookie } from "../token/refresh-token-cookie.decorator"; diff --git a/apps/api/src/modules/authentication/token/token.resolver.ts b/apps/api/src/modules/authentication/token/token.resolver.ts index 5100938..6c53532 100644 --- a/apps/api/src/modules/authentication/token/token.resolver.ts +++ b/apps/api/src/modules/authentication/token/token.resolver.ts @@ -1,5 +1,11 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { AuthCookieService, AuthorizationService, User as DomainUser, RefreshToken, RefreshTokenService } from "@cv/core"; +import { + AuthCookieService, + AuthorizationService, + User as DomainUser, + RefreshToken, + RefreshTokenService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Context, Mutation, Query, Resolver } from "@nestjs/graphql"; import type { Response } from "express"; diff --git a/apps/api/src/modules/cv-parser/__tests__/cv-parser.service.spec.ts b/apps/api/src/modules/cv-parser/__tests__/cv-parser.service.spec.ts index 1507842..28cc841 100644 --- a/apps/api/src/modules/cv-parser/__tests__/cv-parser.service.spec.ts +++ b/apps/api/src/modules/cv-parser/__tests__/cv-parser.service.spec.ts @@ -1,6 +1,7 @@ import { readFileSync } from "node:fs"; import { join } from "node:path"; import { User } from "@cv/core"; +import { TextExtractorRegistry } from "@cv/file-upload"; import { Mocked } from "vitest"; import { AIProviderResolverService } from "../ai-provider-resolver.service"; import { CVParserService } from "../cv-parser.service"; @@ -67,7 +68,7 @@ describe("CVParserService", () => { } as unknown as AIProviderResolverService; service = new CVParserService( - mockTextExtractorRegistry as any, + mockTextExtractorRegistry as unknown as TextExtractorRegistry, mockEntityResolver, mockProviderResolver, ); diff --git a/apps/api/src/modules/cv-parser/__tests__/entity-resolver.service.spec.ts b/apps/api/src/modules/cv-parser/__tests__/entity-resolver.service.spec.ts index 8d30d02..010bc15 100644 --- a/apps/api/src/modules/cv-parser/__tests__/entity-resolver.service.spec.ts +++ b/apps/api/src/modules/cv-parser/__tests__/entity-resolver.service.spec.ts @@ -1,3 +1,4 @@ +import { PrismaService } from "@cv/core"; import { Mock } from "vitest"; import { EntityResolverService } from "../entity-resolver.service"; @@ -22,7 +23,7 @@ describe("EntityResolverService", () => { institution: { findFirst: vi.fn() }, }; - service = new EntityResolverService(mockPrisma as any); + service = new EntityResolverService(mockPrisma as unknown as PrismaService); }); describe("resolveCompany", () => { diff --git a/apps/api/src/modules/cv-parser/ai-provider-resolver.service.ts b/apps/api/src/modules/cv-parser/ai-provider-resolver.service.ts index 17ac031..f2a6d12 100644 --- a/apps/api/src/modules/cv-parser/ai-provider-resolver.service.ts +++ b/apps/api/src/modules/cv-parser/ai-provider-resolver.service.ts @@ -1,6 +1,10 @@ import { randomUUID } from "node:crypto"; import { - AI_PROVIDER, AIProvider, AnthropicProvider, OpenAIProvider, } from "@cv/ai-provider"; + AI_PROVIDER, + AIProvider, + AnthropicProvider, + OpenAIProvider, +} from "@cv/ai-provider"; import { ClockService, User } from "@cv/core"; import { BadRequestException, diff --git a/apps/api/src/modules/cv-parser/cv-parser.module.ts b/apps/api/src/modules/cv-parser/cv-parser.module.ts index 85b1120..36b8e5a 100644 --- a/apps/api/src/modules/cv-parser/cv-parser.module.ts +++ b/apps/api/src/modules/cv-parser/cv-parser.module.ts @@ -23,7 +23,8 @@ import { UploadFileResolver } from "./graphql/upload-file.resolver"; import { ImportOnboardingStep } from "./onboarding/import.step"; @Module({ - imports: [BaseModule, + imports: [ + BaseModule, CVParserCoreModule.forConfig(), AIModule.forConfig(), FileExtractionModule.forRoot(), diff --git a/apps/api/src/modules/cv-parser/cv-parser.service.ts b/apps/api/src/modules/cv-parser/cv-parser.service.ts index 9264626..fa226dc 100644 --- a/apps/api/src/modules/cv-parser/cv-parser.service.ts +++ b/apps/api/src/modules/cv-parser/cv-parser.service.ts @@ -1,10 +1,17 @@ import { CVParserService as CVParser, ParsedCVData } from "@cv/ai-parser"; import { User } from "@cv/core"; import { - TEXT_EXTRACTOR_REGISTRY, TextExtractorRegistry, validateFile, } from "@cv/file-upload"; + TEXT_EXTRACTOR_REGISTRY, + TextExtractorRegistry, + validateFile, +} from "@cv/file-upload"; import { Inject, Injectable } from "@nestjs/common"; import { AIProviderResolverService } from "./ai-provider-resolver.service"; -import { EntityResolverService, ResolvedEducation, ResolvedJobExperience } from "./entity-resolver.service"; +import { + EntityResolverService, + ResolvedEducation, + ResolvedJobExperience, +} from "./entity-resolver.service"; /** * Parsed CV data with resolved entities diff --git a/apps/api/src/modules/cv-template/cv.dataloader.ts b/apps/api/src/modules/cv-template/cv.dataloader.ts index b3d21fd..6f896d8 100644 --- a/apps/api/src/modules/cv-template/cv.dataloader.ts +++ b/apps/api/src/modules/cv-template/cv.dataloader.ts @@ -1,4 +1,4 @@ -import { BaseDataLoaderService, CVService } from "@cv/core"; +import { BaseDataLoaderService, CVService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; import { CV } from "./graphql/cv.type"; diff --git a/apps/api/src/modules/cv-template/graphql/cv-template.resolver.ts b/apps/api/src/modules/cv-template/graphql/cv-template.resolver.ts index 0bf80be..0db68aa 100644 --- a/apps/api/src/modules/cv-template/graphql/cv-template.resolver.ts +++ b/apps/api/src/modules/cv-template/graphql/cv-template.resolver.ts @@ -1,5 +1,15 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, AuthorizationService, CV as CVEntity, CVRendererService, CVService, CVTemplateService, User as DomainUser, PaginationService, UuidFactoryService } from "@cv/core"; +import { + AuthorizationService, + ClockService, + CV as CVEntity, + CVRendererService, + CVService, + CVTemplateService, + User as DomainUser, + PaginationService, + UuidFactoryService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; @@ -19,7 +29,7 @@ export class CVTemplateResolver { private readonly cvTemplateService: CVTemplateService, private readonly paginationService: PaginationService, private readonly authorizationService: AuthorizationService, - private readonly clock: ClockService, + readonly _clock: ClockService, ) {} @Query(() => CVTemplateConnection) @@ -130,7 +140,9 @@ export class CVResolver { existing.createdAt, this.clock.now(), template, - input.introduction === undefined ? existing.introduction : input.introduction, + input.introduction === undefined + ? existing.introduction + : input.introduction, ); return this.cvService.save(updated); diff --git a/apps/api/src/modules/data-import/events/user-file-created.event.ts b/apps/api/src/modules/data-import/events/user-file-created.event.ts index 6bf46e7..1123986 100644 --- a/apps/api/src/modules/data-import/events/user-file-created.event.ts +++ b/apps/api/src/modules/data-import/events/user-file-created.event.ts @@ -1,5 +1,4 @@ -import { User } from "@cv/core"; -import { DomainEvent } from "@cv/core"; +import { DomainEvent, User } from "@cv/core"; import { DataImportSource } from "../data-import-source.interface"; interface UserFileCreatedPayload { diff --git a/apps/api/src/modules/data-import/import-job.policy.ts b/apps/api/src/modules/data-import/import-job.policy.ts index df69f4f..e456cd9 100644 --- a/apps/api/src/modules/data-import/import-job.policy.ts +++ b/apps/api/src/modules/data-import/import-job.policy.ts @@ -1,5 +1,4 @@ -import { IPolicy, User } from "@cv/core"; -import { Policy } from "@cv/core"; +import { IPolicy, Policy, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { ImportJob } from "./import-job.entity"; diff --git a/apps/api/src/modules/data-import/listeners/import-job.listener.ts b/apps/api/src/modules/data-import/listeners/import-job.listener.ts index 577921f..47aeed5 100644 --- a/apps/api/src/modules/data-import/listeners/import-job.listener.ts +++ b/apps/api/src/modules/data-import/listeners/import-job.listener.ts @@ -2,7 +2,11 @@ import { ParsedCVData } from "@cv/ai-parser"; import { ClockService, PrismaService, ProfileService } from "@cv/core"; import { Injectable, Logger } from "@nestjs/common"; import { OnEvent } from "@nestjs/event-emitter"; -import { EntityResolverService, type ResolvedEducation, type ResolvedJobExperience } from "@/modules/cv-parser/entity-resolver.service"; +import { + EntityResolverService, + type ResolvedEducation, + type ResolvedJobExperience, +} from "@/modules/cv-parser/entity-resolver.service"; import { UserFileCreatedEvent } from "../events/user-file-created.event"; interface ResolvedResult { diff --git a/apps/api/src/modules/data-import/sources/file-import-source.ts b/apps/api/src/modules/data-import/sources/file-import-source.ts index a1b9613..23d9aee 100644 --- a/apps/api/src/modules/data-import/sources/file-import-source.ts +++ b/apps/api/src/modules/data-import/sources/file-import-source.ts @@ -3,9 +3,17 @@ import { ExistingUserContext, ParsedCVData, } from "@cv/ai-parser"; -import { EducationService, PrismaService, ProfileService, User, UserJobExperienceService } from "@cv/core"; import { - TEXT_EXTRACTOR_REGISTRY, TextExtractorRegistry, } from "@cv/file-upload"; + EducationService, + PrismaService, + ProfileService, + User, + UserJobExperienceService, +} from "@cv/core"; +import { + TEXT_EXTRACTOR_REGISTRY, + TextExtractorRegistry, +} from "@cv/file-upload"; import { Inject, Injectable, Logger } from "@nestjs/common"; import { AIProviderResolverService } from "@/modules/cv-parser/ai-provider-resolver.service"; import { DataImportSource } from "../data-import-source.interface"; diff --git a/apps/api/src/modules/data-import/user-file.policy.ts b/apps/api/src/modules/data-import/user-file.policy.ts index 696ebb6..aaf2fc0 100644 --- a/apps/api/src/modules/data-import/user-file.policy.ts +++ b/apps/api/src/modules/data-import/user-file.policy.ts @@ -1,12 +1,7 @@ -import { - Policy, PrismaService, ProfileOwnedResourcePolicy, } from "@cv/core"; +import { Policy, ProfileOwnedResourcePolicy } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { UserFile } from "./user-file.entity"; @Injectable() @Policy(UserFile) -export class UserFilePolicy extends ProfileOwnedResourcePolicy { - constructor(prisma: PrismaService) { - super(prisma); - } -} +export class UserFilePolicy extends ProfileOwnedResourcePolicy {} diff --git a/apps/api/src/modules/education/graphql/education.resolver.ts b/apps/api/src/modules/education/graphql/education.resolver.ts index b8aa92d..95b8f9c 100644 --- a/apps/api/src/modules/education/graphql/education.resolver.ts +++ b/apps/api/src/modules/education/graphql/education.resolver.ts @@ -1,7 +1,12 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { User as DomainUser } from "@cv/core"; import { - AuthorizationService, Education as EducationEntity, EducationService, InstitutionService, SkillService, } from "@cv/core"; + AuthorizationService, + User as DomainUser, + Education as EducationEntity, + EducationService, + InstitutionService, + SkillService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/education/graphql/institution.resolver.ts b/apps/api/src/modules/education/graphql/institution.resolver.ts index de98129..fa082e6 100644 --- a/apps/api/src/modules/education/graphql/institution.resolver.ts +++ b/apps/api/src/modules/education/graphql/institution.resolver.ts @@ -1,7 +1,11 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { User as DomainUser } from "@cv/core"; import { - AuthorizationService, Institution as InstitutionEntity, InstitutionFactory, InstitutionService, } from "@cv/core"; + AuthorizationService, + User as DomainUser, + Institution as InstitutionEntity, + InstitutionFactory, + InstitutionService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/education/graphql/user-field.resolver.ts b/apps/api/src/modules/education/graphql/user-field.resolver.ts index 40a2adf..678e60e 100644 --- a/apps/api/src/modules/education/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/education/graphql/user-field.resolver.ts @@ -1,5 +1,10 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { EducationService, PaginationArgs, PaginationService, PrismaService } from "@cv/core"; +import { + EducationService, + PaginationArgs, + PaginationService, + PrismaService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; diff --git a/apps/api/src/modules/job-experience/company/company.dataloader.ts b/apps/api/src/modules/job-experience/company/company.dataloader.ts index 6effe79..359cd3a 100644 --- a/apps/api/src/modules/job-experience/company/company.dataloader.ts +++ b/apps/api/src/modules/job-experience/company/company.dataloader.ts @@ -1,5 +1,4 @@ -import { - BaseDataLoaderService, Company, CompanyService, } from "@cv/core"; +import { BaseDataLoaderService, Company, CompanyService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/job-experience/company/graphql/company.resolver.ts b/apps/api/src/modules/job-experience/company/graphql/company.resolver.ts index c56b7d0..6072f2f 100644 --- a/apps/api/src/modules/job-experience/company/graphql/company.resolver.ts +++ b/apps/api/src/modules/job-experience/company/graphql/company.resolver.ts @@ -1,7 +1,14 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser } from "@cv/core"; import { - AuthorizationService, Company, Company as CompanyEntity, CompanyFactory, CompanyService, PaginationService, } from "@cv/core"; + AuthorizationService, + ClockService, + Company, + Company as CompanyEntity, + CompanyFactory, + CompanyService, + User as DomainUser, + PaginationService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/job-experience/company/graphql/company.type.ts b/apps/api/src/modules/job-experience/company/graphql/company.type.ts index 9d3659c..685be20 100644 --- a/apps/api/src/modules/job-experience/company/graphql/company.type.ts +++ b/apps/api/src/modules/job-experience/company/graphql/company.type.ts @@ -1,7 +1,4 @@ -import { - Company as CompanyDomain, - Company as DomainCompany, -} from "@cv/core"; +import { Company as CompanyDomain, Company as DomainCompany } from "@cv/core"; import { Field, ID, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; diff --git a/apps/api/src/modules/job-experience/employment/graphql/employment.resolver.ts b/apps/api/src/modules/job-experience/employment/graphql/employment.resolver.ts index af2c1a7..21b7233 100644 --- a/apps/api/src/modules/job-experience/employment/graphql/employment.resolver.ts +++ b/apps/api/src/modules/job-experience/employment/graphql/employment.resolver.ts @@ -1,11 +1,16 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; import { + AuthorizationService, + CompanyService, CreateUserJobExperienceDto, User as DomainUser, + LevelService, + RoleService, + SkillService, UpdateUserJobExperienceDto, + UserJobExperience as UserJobExperienceEntity, + UserJobExperienceService, } from "@cv/core"; -import { - AuthorizationService, CompanyService, LevelService, RoleService, SkillService, UserJobExperience as UserJobExperienceEntity, UserJobExperienceService, } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/job-experience/employment/graphql/user-field.resolver.ts b/apps/api/src/modules/job-experience/employment/graphql/user-field.resolver.ts index edb7809..39f72f3 100644 --- a/apps/api/src/modules/job-experience/employment/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/job-experience/employment/graphql/user-field.resolver.ts @@ -1,5 +1,10 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationArgs, PaginationService, PrismaService, UserJobExperienceService } from "@cv/core"; +import { + PaginationArgs, + PaginationService, + PrismaService, + UserJobExperienceService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; diff --git a/apps/api/src/modules/job-experience/level/graphql/level.resolver.ts b/apps/api/src/modules/job-experience/level/graphql/level.resolver.ts index c4be94a..01358d0 100644 --- a/apps/api/src/modules/job-experience/level/graphql/level.resolver.ts +++ b/apps/api/src/modules/job-experience/level/graphql/level.resolver.ts @@ -1,7 +1,13 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser } from "@cv/core"; import { - AuthorizationService, Level as LevelEntity, LevelFactory, LevelService, PaginationService, } from "@cv/core"; + AuthorizationService, + ClockService, + User as DomainUser, + Level as LevelEntity, + LevelFactory, + LevelService, + PaginationService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/job-experience/level/level.dataloader.ts b/apps/api/src/modules/job-experience/level/level.dataloader.ts index 7f1604d..9621631 100644 --- a/apps/api/src/modules/job-experience/level/level.dataloader.ts +++ b/apps/api/src/modules/job-experience/level/level.dataloader.ts @@ -1,4 +1,4 @@ -import { BaseDataLoaderService, Level, LevelService } from "@cv/core"; +import { BaseDataLoaderService, Level, LevelService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/job-experience/role/graphql/role.resolver.ts b/apps/api/src/modules/job-experience/role/graphql/role.resolver.ts index 20ffbd1..b05536d 100644 --- a/apps/api/src/modules/job-experience/role/graphql/role.resolver.ts +++ b/apps/api/src/modules/job-experience/role/graphql/role.resolver.ts @@ -1,7 +1,13 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser } from "@cv/core"; import { - AuthorizationService, PaginationService, Role as RoleEntity, RoleFactory, RoleService, } from "@cv/core"; + AuthorizationService, + ClockService, + User as DomainUser, + PaginationService, + Role as RoleEntity, + RoleFactory, + RoleService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/job-experience/role/role.dataloader.ts b/apps/api/src/modules/job-experience/role/role.dataloader.ts index e6182a5..4b9ed6e 100644 --- a/apps/api/src/modules/job-experience/role/role.dataloader.ts +++ b/apps/api/src/modules/job-experience/role/role.dataloader.ts @@ -1,4 +1,4 @@ -import { BaseDataLoaderService, Role, RoleService } from "@cv/core"; +import { BaseDataLoaderService, Role, RoleService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/job-experience/skill/graphql/skill.resolver.ts b/apps/api/src/modules/job-experience/skill/graphql/skill.resolver.ts index 2fca253..14015f2 100644 --- a/apps/api/src/modules/job-experience/skill/graphql/skill.resolver.ts +++ b/apps/api/src/modules/job-experience/skill/graphql/skill.resolver.ts @@ -1,7 +1,13 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser } from "@cv/core"; import { - AuthorizationService, PaginationService, Skill as SkillEntity, SkillFactory, SkillService, } from "@cv/core"; + AuthorizationService, + ClockService, + User as DomainUser, + PaginationService, + Skill as SkillEntity, + SkillFactory, + SkillService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/job-experience/skill/skill.module.ts b/apps/api/src/modules/job-experience/skill/skill.module.ts index d599f1c..fd5cd0d 100644 --- a/apps/api/src/modules/job-experience/skill/skill.module.ts +++ b/apps/api/src/modules/job-experience/skill/skill.module.ts @@ -2,6 +2,7 @@ import { AuthorizationModule, BaseModule, DatabaseModule, + ReferenceDataSeedService, SkillFactory, SkillMapper, SkillPolicy, @@ -10,7 +11,6 @@ import { import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { JobExperienceSeedService } from "@/seed/seeders/job-experience.seed"; -import { ReferenceDataSeedService } from "@cv/core"; import { SkillResolver } from "./graphql/skill.resolver"; @Module({ diff --git a/apps/api/src/modules/organization/graphql/organization.resolver.ts b/apps/api/src/modules/organization/graphql/organization.resolver.ts index e18f251..3e0c7ba 100644 --- a/apps/api/src/modules/organization/graphql/organization.resolver.ts +++ b/apps/api/src/modules/organization/graphql/organization.resolver.ts @@ -1,7 +1,17 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { ClockService, User as DomainUser, Membership } from "@cv/core"; import { - AuthorizationService, MembershipSortField, MembershipSortOrder, Organization, OrganizationFactory, OrganizationService, PaginationService, UserService, } from "@cv/core"; + AuthorizationService, + ClockService, + User as DomainUser, + Membership, + MembershipSortField, + MembershipSortOrder, + Organization, + OrganizationFactory, + OrganizationService, + PaginationService, + UserService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, diff --git a/apps/api/src/modules/organization/graphql/user-field.resolver.ts b/apps/api/src/modules/organization/graphql/user-field.resolver.ts index ac15691..77e7654 100644 --- a/apps/api/src/modules/organization/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/organization/graphql/user-field.resolver.ts @@ -1,5 +1,5 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { Organization, OrganizationService } from "@cv/core"; +import { Organization, OrganizationService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; diff --git a/apps/api/src/modules/organization/organization.module.ts b/apps/api/src/modules/organization/organization.module.ts index 31b5c7a..1bcf8bd 100644 --- a/apps/api/src/modules/organization/organization.module.ts +++ b/apps/api/src/modules/organization/organization.module.ts @@ -12,10 +12,10 @@ import { } from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; -import { OrganizationResolver } from "./graphql/organization.resolver"; -import { UserFieldResolver } from "./graphql/user-field.resolver"; import { MembershipSeedService } from "@/seed/seeders/membership.seed"; import { OrganizationSeedService } from "@/seed/seeders/organization.seed"; +import { OrganizationResolver } from "./graphql/organization.resolver"; +import { UserFieldResolver } from "./graphql/user-field.resolver"; @Module({ imports: [ diff --git a/apps/api/src/modules/profile/graphql/profile-field.resolver.ts b/apps/api/src/modules/profile/graphql/profile-field.resolver.ts index 4b63f47..0808633 100644 --- a/apps/api/src/modules/profile/graphql/profile-field.resolver.ts +++ b/apps/api/src/modules/profile/graphql/profile-field.resolver.ts @@ -1,5 +1,10 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { EducationService, PaginationArgs, PaginationService, UserJobExperienceService } from "@cv/core"; +import { + EducationService, + PaginationArgs, + PaginationService, + UserJobExperienceService, +} from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { EducationConnection } from "@/modules/education/graphql/education.type"; diff --git a/apps/api/src/modules/profile/graphql/profile.resolver.ts b/apps/api/src/modules/profile/graphql/profile.resolver.ts index 13929c8..cc692d9 100644 --- a/apps/api/src/modules/profile/graphql/profile.resolver.ts +++ b/apps/api/src/modules/profile/graphql/profile.resolver.ts @@ -25,7 +25,10 @@ export class ProfileResolver { @CurrentUser() user: DomainUser, @Args("id", { type: () => ID }) id: string, ): Promise { - const profile = await this.profileService.findByIdAndUserOrFail(id, user.id); + const profile = await this.profileService.findByIdAndUserOrFail( + id, + user.id, + ); return ProfileType.fromDomain(profile); } diff --git a/apps/api/src/modules/user/user.type.ts b/apps/api/src/modules/user/user.type.ts index 2189d46..270c410 100644 --- a/apps/api/src/modules/user/user.type.ts +++ b/apps/api/src/modules/user/user.type.ts @@ -1,5 +1,4 @@ -import { User as DomainUser } from "@cv/core"; -import { UserRole } from "@cv/core"; +import { User as DomainUser, UserRole } from "@cv/core"; import { Field, ID, ObjectType, registerEnumType } from "@nestjs/graphql"; registerEnumType(UserRole, { name: "UserRole" }); diff --git a/apps/api/src/modules/vacancies/contract-type/contract-type.dataloader.ts b/apps/api/src/modules/vacancies/contract-type/contract-type.dataloader.ts index 22c95cb..53a0936 100644 --- a/apps/api/src/modules/vacancies/contract-type/contract-type.dataloader.ts +++ b/apps/api/src/modules/vacancies/contract-type/contract-type.dataloader.ts @@ -1,5 +1,8 @@ import { - BaseDataLoaderService, ContractType, ContractTypeService, } from "@cv/core"; + BaseDataLoaderService, + ContractType, + ContractTypeService, +} from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts b/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts index e669533..264faf1 100644 --- a/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts +++ b/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts @@ -1,7 +1,12 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { User as DomainUser } from "@cv/core"; import { - AuthorizationService, SkillService, Vacancy as VacancyEntity, VacancyFactory, VacancyService, } from "@cv/core"; + AuthorizationService, + User as DomainUser, + SkillService, + Vacancy as VacancyEntity, + VacancyFactory, + VacancyService, +} from "@cv/core"; import { compact } from "@cv/utils"; import { UseGuards } from "@nestjs/common"; import { diff --git a/apps/api/src/modules/vacancies/graphql/vacancy.type.ts b/apps/api/src/modules/vacancies/graphql/vacancy.type.ts index ca70dbd..a736a92 100644 --- a/apps/api/src/modules/vacancies/graphql/vacancy.type.ts +++ b/apps/api/src/modules/vacancies/graphql/vacancy.type.ts @@ -1,7 +1,4 @@ -import { - Vacancy as DomainVacancy, - Vacancy as VacancyEntity, -} from "@cv/core"; +import { Vacancy as DomainVacancy, Vacancy as VacancyEntity } from "@cv/core"; import { Field, ObjectType } from "@nestjs/graphql"; import { BaseGraphQLType } from "@/modules/base/base-graphql-type"; import { createConnection } from "@/modules/base/connection.factory"; diff --git a/apps/api/src/modules/vacancies/location/location.dataloader.ts b/apps/api/src/modules/vacancies/location/location.dataloader.ts index de1fd47..f249855 100644 --- a/apps/api/src/modules/vacancies/location/location.dataloader.ts +++ b/apps/api/src/modules/vacancies/location/location.dataloader.ts @@ -1,5 +1,8 @@ import { - BaseDataLoaderService, Location, VacancyLocationService, } from "@cv/core"; + BaseDataLoaderService, + Location, + VacancyLocationService, +} from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/vacancies/rate-type/rate-type.dataloader.ts b/apps/api/src/modules/vacancies/rate-type/rate-type.dataloader.ts index 0cade7d..9b7d0f3 100644 --- a/apps/api/src/modules/vacancies/rate-type/rate-type.dataloader.ts +++ b/apps/api/src/modules/vacancies/rate-type/rate-type.dataloader.ts @@ -1,5 +1,4 @@ -import { - BaseDataLoaderService, RateType, RateTypeService, } from "@cv/core"; +import { BaseDataLoaderService, RateType, RateTypeService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/vacancies/vacancy.dataloader.ts b/apps/api/src/modules/vacancies/vacancy.dataloader.ts index 5a43ddd..8c5e20c 100644 --- a/apps/api/src/modules/vacancies/vacancy.dataloader.ts +++ b/apps/api/src/modules/vacancies/vacancy.dataloader.ts @@ -1,5 +1,4 @@ -import { - BaseDataLoaderService, Vacancy, VacancyService, } from "@cv/core"; +import { BaseDataLoaderService, Vacancy, VacancyService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; @Injectable({ scope: Scope.REQUEST }) diff --git a/apps/api/src/modules/vacancies/vacancy.module.ts b/apps/api/src/modules/vacancies/vacancy.module.ts index 3836b82..e249375 100644 --- a/apps/api/src/modules/vacancies/vacancy.module.ts +++ b/apps/api/src/modules/vacancies/vacancy.module.ts @@ -13,12 +13,12 @@ import { CompanyModule } from "@/modules/job-experience/company/company.module"; import { LevelModule } from "@/modules/job-experience/level/level.module"; import { RoleModule } from "@/modules/job-experience/role/role.module"; import { SkillModule } from "@/modules/job-experience/skill/skill.module"; +import { VacancySeedService } from "@/seed/seeders/vacancy.seed"; import { ContractTypeModule } from "./contract-type/contract-type.module"; import { VacancyUserFieldResolver } from "./graphql/user-field.resolver"; import { VacancyResolver } from "./graphql/vacancy.resolver"; import { LocationModule } from "./location/location.module"; import { RateTypeModule } from "./rate-type/rate-type.module"; -import { VacancySeedService } from "@/seed/seeders/vacancy.seed"; import { VacancyDataLoaderService } from "./vacancy.dataloader"; @Module({ diff --git a/apps/api/src/scripts/seed-test.ts b/apps/api/src/scripts/seed-test.ts index 2239eb9..f5333e6 100644 --- a/apps/api/src/scripts/seed-test.ts +++ b/apps/api/src/scripts/seed-test.ts @@ -1,6 +1,6 @@ +import { SeedService } from "@cv/core"; import { NestFactory } from "@nestjs/core"; import { SeedModule } from "@/seed/seed.module"; -import { SeedService } from "@cv/core"; async function main(): Promise { const app = await NestFactory.createApplicationContext(SeedModule); diff --git a/apps/api/src/scripts/seed.ts b/apps/api/src/scripts/seed.ts index 4f59a13..4dec0b5 100644 --- a/apps/api/src/scripts/seed.ts +++ b/apps/api/src/scripts/seed.ts @@ -1,6 +1,6 @@ +import { SeedService } from "@cv/core"; import { NestFactory } from "@nestjs/core"; import { AppModule } from "../modules/app.module"; -import { SeedService } from "@cv/core"; async function bootstrap() { const app = await NestFactory.createApplicationContext(AppModule); diff --git a/apps/api/src/seed/seeders/membership.seed.ts b/apps/api/src/seed/seeders/membership.seed.ts index a771097..3ed555c 100644 --- a/apps/api/src/seed/seeders/membership.seed.ts +++ b/apps/api/src/seed/seeders/membership.seed.ts @@ -1,4 +1,4 @@ -import { type Seeder, SeederDecorator, PrismaService } from "@cv/core"; +import { PrismaService, type Seeder, SeederDecorator } from "@cv/core"; import { faker } from "@faker-js/faker"; import { Injectable, Logger } from "@nestjs/common"; diff --git a/apps/api/src/seed/seeders/organization.seed.ts b/apps/api/src/seed/seeders/organization.seed.ts index fe56893..d4347c7 100644 --- a/apps/api/src/seed/seeders/organization.seed.ts +++ b/apps/api/src/seed/seeders/organization.seed.ts @@ -1,4 +1,4 @@ -import { type Seeder, SeederDecorator, PrismaService } from "@cv/core"; +import { PrismaService, type Seeder, SeederDecorator } from "@cv/core"; import { faker } from "@faker-js/faker"; import { Injectable, Logger } from "@nestjs/common"; diff --git a/apps/api/src/seed/seeders/user.seed.ts b/apps/api/src/seed/seeders/user.seed.ts index 1134b8e..e4ddd3c 100644 --- a/apps/api/src/seed/seeders/user.seed.ts +++ b/apps/api/src/seed/seeders/user.seed.ts @@ -1,4 +1,10 @@ -import { type Seeder, SeederDecorator, CredentialsService, PrismaService, UserService } from "@cv/core"; +import { + CredentialsService, + PrismaService, + type Seeder, + SeederDecorator, + UserService, +} from "@cv/core"; import { Injectable, Logger } from "@nestjs/common"; @Injectable() diff --git a/apps/api/src/seed/seeders/vacancy.seed.ts b/apps/api/src/seed/seeders/vacancy.seed.ts index 94e19c7..6ba55d0 100644 --- a/apps/api/src/seed/seeders/vacancy.seed.ts +++ b/apps/api/src/seed/seeders/vacancy.seed.ts @@ -1,4 +1,4 @@ -import { type Seeder, SeederDecorator, PrismaService } from "@cv/core"; +import { PrismaService, type Seeder, SeederDecorator } from "@cv/core"; import { faker } from "@faker-js/faker"; import { Injectable, Logger } from "@nestjs/common"; diff --git a/apps/api/test/auth.e2e-spec.ts b/apps/api/test/auth.e2e-spec.ts index 6a98beb..f940393 100644 --- a/apps/api/test/auth.e2e-spec.ts +++ b/apps/api/test/auth.e2e-spec.ts @@ -1,6 +1,6 @@ import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, TestingModule } from "@nestjs/testing"; +import { Test, TestingModule } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "../src/modules/app.module"; import { diff --git a/apps/api/test/cv-upload-integration.e2e-spec.ts b/apps/api/test/cv-upload-integration.e2e-spec.ts index b961a38..69c2860 100644 --- a/apps/api/test/cv-upload-integration.e2e-spec.ts +++ b/apps/api/test/cv-upload-integration.e2e-spec.ts @@ -25,61 +25,39 @@ describe("CV Upload Integration Tests", () => { }; beforeAll(async () => { - // Check if server is running - try { - const healthResponse = await request(SERVER_URL).get("/health"); - expect(healthResponse.status).toBe(200); - console.log(`\n✅ Server is running at ${SERVER_URL}`); - } catch (error) { - console.error(`\n❌ Server not running at ${SERVER_URL}`); - console.error(` Start with: docker compose up -d`); - throw error; - } - - // Register test user - try { - const registerResponse = await request(SERVER_URL) - .post("/api/auth/password/register") - .send(TEST_USER) + const healthResponse = await request(SERVER_URL).get("/health"); + expect(healthResponse.status).toBe(200); + const registerResponse = await request(SERVER_URL) + .post("/api/auth/password/register") + .send(TEST_USER) + .timeout(10000); + + if (registerResponse.status === 201 && registerResponse.body.accessToken) { + accessToken = registerResponse.body.accessToken; + } else if (registerResponse.status === 409) { + // User exists, try login + const loginResponse = await request(SERVER_URL) + .post("/api/auth/password/login") + .send({ + email: TEST_USER.email, + password: TEST_USER.password, + }) .timeout(10000); - if ( - registerResponse.status === 201 && - registerResponse.body.accessToken - ) { - accessToken = registerResponse.body.accessToken; - console.log(`✅ Test user registered`); - } else if (registerResponse.status === 409) { - // User exists, try login - const loginResponse = await request(SERVER_URL) - .post("/api/auth/password/login") - .send({ - email: TEST_USER.email, - password: TEST_USER.password, - }) - .timeout(10000); - - accessToken = loginResponse.body.accessToken; - console.log(`✅ Test user logged in`); - } else { - throw new Error( - `Unexpected registration response: ${registerResponse.status}`, - ); - } - - expect(accessToken).toBeDefined(); - } catch (error) { - console.error(`❌ Authentication failed:`, error); - throw error; + accessToken = loginResponse.body.accessToken; + } else { + throw new Error( + `Unexpected registration response: ${registerResponse.status}`, + ); } + + expect(accessToken).toBeDefined(); }); describe("Text File Parsing", () => { it("should parse test-cv.txt successfully", async () => { const cvPath = join(__dirname, "../../../test-cv.txt"); const cvBuffer = readFileSync(cvPath); - - console.log(`\n📄 Testing: test-cv.txt`); const startTime = Date.now(); const response = await request(SERVER_URL) @@ -97,23 +75,11 @@ describe("CV Upload Integration Tests", () => { const { data } = response.body; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${data.personalInfo.name || "N/A"}`); - console.log(` Email: ${data.personalInfo.email || "N/A"}`); - console.log(` Job Experiences: ${data.jobExperiences?.length || 0}`); - console.log(` Education: ${data.education?.length || 0}`); - console.log(` Skills: ${data.skills?.length || 0}`); - // Performance feedback if (duration < 30) { - console.log(` 🚀 Excellent! (GPU-accelerated)`); } else if (duration < 60) { - console.log(` ✅ Good performance`); } else if (duration < 180) { - console.log(` ⚠️ Slower than expected (CPU-only?)`); } else { - console.log(` ❌ Very slow - check llama-server`); } // Verify parsed data structure @@ -125,8 +91,6 @@ describe("CV Upload Integration Tests", () => { it("should parse test-cv-tiny.md quickly", async () => { const cvPath = join(__dirname, "../../../test-cv-tiny.md"); const cvBuffer = readFileSync(cvPath); - - console.log(`\n📄 Testing: test-cv-tiny.md`); const startTime = Date.now(); const response = await request(SERVER_URL) @@ -138,10 +102,6 @@ describe("CV Upload Integration Tests", () => { const duration = (Date.now() - startTime) / 1000; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${response.body.data.personalInfo.name || "N/A"}`); - expect(response.body.success).toBe(true); expect(duration).toBeLessThan(60); // Tiny CV should parse in <1 min }, 120000); @@ -160,8 +120,6 @@ describe("CV Upload Integration Tests", () => { try { const buffer = readFileSync(filePath); - - console.log(`\n📄 Testing: ${fileName}`); const startTime = Date.now(); const response = await request(SERVER_URL) @@ -173,31 +131,9 @@ describe("CV Upload Integration Tests", () => { const duration = (Date.now() - startTime) / 1000; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log( - ` Name: ${response.body.data.personalInfo.name || "N/A"}`, - ); - console.log( - ` Email: ${response.body.data.personalInfo.email || "N/A"}`, - ); - console.log( - ` Phone: ${response.body.data.personalInfo.phone || "N/A"}`, - ); - console.log( - ` Job Experiences: ${response.body.data.jobExperiences?.length || 0}`, - ); - console.log( - ` Education: ${response.body.data.education?.length || 0}`, - ); - console.log(` Skills: ${response.body.data.skills?.length || 0}`); - if (duration < 30) { - console.log(` 🚀 Excellent performance!`); } else if (duration < 60) { - console.log(` ✅ Good performance`); } else { - console.log(` ⚠️ Slower than target`); } expect(response.body.success).toBe(true); @@ -210,7 +146,6 @@ describe("CV Upload Integration Tests", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); } else { throw error; } @@ -225,8 +160,6 @@ describe("CV Upload Integration Tests", () => { try { const buffer = readFileSync(filePath); - - console.log(`\n📄 Testing: ${fileName}`); const startTime = Date.now(); const response = await request(SERVER_URL) @@ -236,16 +169,7 @@ describe("CV Upload Integration Tests", () => { .timeout(360000) .expect(201); - const duration = (Date.now() - startTime) / 1000; - - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log( - ` Name: ${response.body.data.personalInfo.name || "N/A"}`, - ); - console.log( - ` Job Experiences: ${response.body.data.jobExperiences?.length || 0}`, - ); + const _duration = (Date.now() - startTime) / 1000; expect(response.body.success).toBe(true); } catch (error) { @@ -254,7 +178,6 @@ describe("CV Upload Integration Tests", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); } else { throw error; } @@ -316,7 +239,6 @@ describe("CV Upload Integration Tests", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); } else { results.push({ file: fileName, duration: 0, success: false }); } @@ -325,17 +247,8 @@ describe("CV Upload Integration Tests", () => { // Print benchmark summary if (results.length > 0) { - console.log(`\n${"=".repeat(50)}`); - console.log(`📊 Performance Benchmark Summary`); - console.log(`${"=".repeat(50)}`); - console.log(`${"File".padEnd(25)} | Duration | Status`); - console.log(`${"-".repeat(25)} | -------- | ------`); - for (const result of results) { - const status = result.success ? "✅" : "❌"; - console.log( - `${result.file.padEnd(25)} | ${result.duration.toFixed(1).padStart(6)}s | ${status}`, - ); + const _status = result.success ? "✅" : "❌"; } const successfulResults = results.filter((r) => r.success); @@ -343,17 +256,12 @@ describe("CV Upload Integration Tests", () => { const avgDuration = successfulResults.reduce((sum, r) => sum + r.duration, 0) / successfulResults.length; - console.log(`\nAverage: ${avgDuration.toFixed(1)}s`); if (avgDuration < 30) { - console.log(`🚀 GPU acceleration detected`); } else if (avgDuration < 60) { - console.log(`✅ Acceptable performance`); } else { - console.log(`⚠️ Running on CPU (slow)`); } } - console.log(`${"=".repeat(50)}\n`); } // At least one should succeed diff --git a/apps/api/test/cv-upload.e2e-spec.ts b/apps/api/test/cv-upload.e2e-spec.ts index cd7e7e1..d5e6289 100644 --- a/apps/api/test/cv-upload.e2e-spec.ts +++ b/apps/api/test/cv-upload.e2e-spec.ts @@ -2,7 +2,7 @@ import { readFileSync } from "node:fs"; import { join } from "node:path"; import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, TestingModule } from "@nestjs/testing"; +import { Test, TestingModule } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "../src/modules/app.module"; @@ -96,29 +96,16 @@ describe("CV Upload and Parsing (e2e)", () => { expect(data.jobExperiences).toBeInstanceOf(Array); expect(data.education).toBeInstanceOf(Array); - // Log performance metrics - console.log(`\n⏱️ CV Parsing Performance:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${data.personalInfo.name}`); - console.log(` Job Experiences: ${data.jobExperiences.length}`); - console.log(` Education: ${data.education.length}`); - console.log(` Skills: ${data.skills?.length || 0}`); - // Performance assertions if (duration < 30) { - console.log(` 🚀 Excellent! (GPU-accelerated)`); } else if (duration < 60) { - console.log(` ✅ Good performance`); } else if (duration < 180) { - console.log(` ⚠️ Slower than expected (CPU-only?)`); } else { - console.log(` ❌ Very slow - check llama-server`); } // Don't fail on slow performance in CI/CPU environments // but warn if extremely slow if (duration > 300) { - console.warn(` ⚠️ Warning: Parsing took ${duration}s (>5 minutes)`); } }, 360000); // 6 minute timeout for CPU fallback @@ -139,8 +126,6 @@ describe("CV Upload and Parsing (e2e)", () => { expect(response.body.success).toBe(true); expect(response.body.data.personalInfo).toBeDefined(); - console.log(`\n⏱️ Tiny CV Parsing: ${duration.toFixed(1)}s`); - // Tiny CVs should parse faster expect(duration).toBeLessThan(60); }, 120000); @@ -162,17 +147,11 @@ describe("CV Upload and Parsing (e2e)", () => { .attach("file", pdfBuffer, "sample-cv.pdf") .expect(201); - const duration = (Date.now() - startTime) / 1000; + const _duration = (Date.now() - startTime) / 1000; expect(response.body.success).toBe(true); expect(response.body.data).toBeDefined(); - - console.log(`\n⏱️ PDF Parsing: ${duration.toFixed(1)}s`); - } catch (error) { - console.log( - ` ⚠️ Skipping PDF test: test-files/sample-cv.pdf not found`, - ); - } + } catch (_error) {} }, 360000); }); @@ -229,33 +208,20 @@ describe("CV Upload and Parsing (e2e)", () => { const duration = (Date.now() - startTime) / 1000; results.push({ file: fileName, duration }); - } catch { - console.log(` ⚠️ Skipping ${fileName}: file not found`); - } + } catch {} } // Print benchmark summary if (results.length > 0) { - console.log(`\n📊 Performance Benchmark Summary:`); - console.log(` ${"File".padEnd(20)} | Duration`); - console.log(` ${"-".repeat(20)} | ${"-".repeat(10)}`); - - for (const result of results) { - console.log( - ` ${result.file.padEnd(20)} | ${result.duration.toFixed(1)}s`, - ); + for (const _result of results) { } const avgDuration = results.reduce((sum, r) => sum + r.duration, 0) / results.length; - console.log(`\n Average: ${avgDuration.toFixed(1)}s`); if (avgDuration < 30) { - console.log(` 🚀 GPU acceleration detected`); } else if (avgDuration < 60) { - console.log(` ✅ Acceptable performance`); } else { - console.log(` ⚠️ Running on CPU (slow)`); } } }, 600000); // 10 minute timeout for multiple files @@ -282,20 +248,10 @@ describe("CV Upload and Parsing (e2e)", () => { .attach("file", buffer, fileName) .expect(201); - const duration = (Date.now() - startTime) / 1000; - - console.log(`\n📄 Parsed: ${fileName}`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log( - ` Name: ${response.body.data.personalInfo.name || "N/A"}`, - ); - console.log(` Jobs: ${response.body.data.jobExperiences.length}`); - console.log(` Education: ${response.body.data.education.length}`); + const _duration = (Date.now() - startTime) / 1000; expect(response.body.success).toBe(true); - } catch { - console.log(` ⚠️ Skipping ${fileName}: not found in Downloads`); - } + } catch {} } }, 600000); // 10 minute timeout for real CVs }); diff --git a/apps/api/test/cv-upload.integration.ts b/apps/api/test/cv-upload.integration.ts index 65c5bb5..8d29084 100644 --- a/apps/api/test/cv-upload.integration.ts +++ b/apps/api/test/cv-upload.integration.ts @@ -9,7 +9,7 @@ */ import { readFileSync } from "node:fs"; import { join } from "node:path"; -import { afterAll, beforeAll, describe, expect, it } from "vitest"; +import { beforeAll, describe, expect, it } from "vitest"; const SERVER_URL = process.env.SERVER_URL || "http://localhost:3000"; @@ -53,7 +53,6 @@ describe("CV Upload Integration", () => { // Check server health const healthResponse = await fetch(`${SERVER_URL}/health`); expect(healthResponse.ok).toBe(true); - console.log(`\n✅ Server is running at ${SERVER_URL}`); // Register user via GraphQL (using snake_case for GraphQL schema) const REGISTER_MUTATION = ` @@ -81,48 +80,40 @@ describe("CV Upload Integration", () => { } } `; + const registerResponse = await fetch(`${SERVER_URL}/graphql`, { + method: "POST", + headers: { "Content-Type": "application/json" }, + body: JSON.stringify({ + query: REGISTER_MUTATION, + variables: TEST_USER, + }), + }); + + const registerData = await registerResponse.json(); - try { - const registerResponse = await fetch(`${SERVER_URL}/graphql`, { + if (registerData.data?.register?.access_token) { + accessToken = registerData.data.register.access_token; + } else if (registerData.errors) { + // User might exist, try login + const loginResponse = await fetch(`${SERVER_URL}/graphql`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ - query: REGISTER_MUTATION, - variables: TEST_USER, + query: LOGIN_MUTATION, + variables: { + email: TEST_USER.email, + password: TEST_USER.password, + }, }), }); - const registerData = await registerResponse.json(); + const loginData = await loginResponse.json(); - if (registerData.data?.register?.access_token) { - accessToken = registerData.data.register.access_token; - console.log(`✅ User registered via GraphQL`); - } else if (registerData.errors) { - // User might exist, try login - const loginResponse = await fetch(`${SERVER_URL}/graphql`, { - method: "POST", - headers: { "Content-Type": "application/json" }, - body: JSON.stringify({ - query: LOGIN_MUTATION, - variables: { - email: TEST_USER.email, - password: TEST_USER.password, - }, - }), - }); - - const loginData = await loginResponse.json(); - - if (loginData.data?.login?.access_token) { - accessToken = loginData.data.login.access_token; - console.log(`✅ User logged in via GraphQL`); - } else { - throw new Error(`Login failed: ${JSON.stringify(loginData)}`); - } + if (loginData.data?.login?.access_token) { + accessToken = loginData.data.login.access_token; + } else { + throw new Error(`Login failed: ${JSON.stringify(loginData)}`); } - } catch (error) { - console.error("❌ Authentication failed:", error); - throw error; } expect(accessToken).toBeDefined(); @@ -157,8 +148,6 @@ describe("CV Upload Integration", () => { describe("Text Files", () => { it("should parse test-cv.txt", async () => { const filePath = join(__dirname, "../../../test-cv.txt"); - - console.log(`\n📄 Testing: test-cv.txt`); const { response, duration } = await uploadCV(filePath, "test-cv.txt"); expect(response.ok).toBe(true); @@ -168,29 +157,14 @@ describe("CV Upload Integration", () => { expect(result.success).toBe(true); expect(result.data.personalInfo).toBeDefined(); - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${result.data.personalInfo.name || "N/A"}`); - console.log(` Email: ${result.data.personalInfo.email || "N/A"}`); - console.log( - ` Job Experiences: ${result.data.jobExperiences?.length || 0}`, - ); - console.log(` Education: ${result.data.education?.length || 0}`); - console.log(` Skills: ${result.data.skills?.length || 0}`); - if (duration < 30) { - console.log(` 🚀 Excellent! (GPU-accelerated)`); } else if (duration < 60) { - console.log(` ✅ Good performance`); } else { - console.log(` ⚠️ Slower than target`); } }); it("should parse test-cv-tiny.md quickly", async () => { const filePath = join(__dirname, "../../../test-cv-tiny.md"); - - console.log(`\n📄 Testing: test-cv-tiny.md`); const { response, duration } = await uploadCV( filePath, "test-cv-tiny.md", @@ -200,10 +174,6 @@ describe("CV Upload Integration", () => { const result = (await response.json()) as UploadResponse; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${result.data.personalInfo.name || "N/A"}`); - expect(result.success).toBe(true); expect(duration).toBeLessThan(60); }); @@ -221,7 +191,6 @@ describe("CV Upload Integration", () => { const filePath = join(downloadsPath, fileName); try { - console.log(`\n📄 Testing: ${fileName}`); const buffer = readFileSync(filePath); // Create form data with correct PDF mime type @@ -245,21 +214,8 @@ describe("CV Upload Integration", () => { const result = (await response.json()) as UploadResponse; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${result.data.personalInfo.name || "N/A"}`); - console.log(` Email: ${result.data.personalInfo.email || "N/A"}`); - console.log(` Phone: ${result.data.personalInfo.phone || "N/A"}`); - console.log( - ` Job Experiences: ${result.data.jobExperiences?.length || 0}`, - ); - console.log(` Education: ${result.data.education?.length || 0}`); - console.log(` Skills: ${result.data.skills?.length || 0}`); - if (duration < 30) { - console.log(` 🚀 Excellent!`); } else if (duration < 60) { - console.log(` ✅ Good`); } expect(result.success).toBe(true); @@ -272,7 +228,6 @@ describe("CV Upload Integration", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); continue; } throw error; @@ -286,7 +241,6 @@ describe("CV Upload Integration", () => { const filePath = join(downloadsPath, fileName); try { - console.log(`\n📄 Testing: ${fileName}`); const buffer = readFileSync(filePath); // Create form data with DOCX mime type @@ -306,19 +260,12 @@ describe("CV Upload Integration", () => { body: formData, }); - const duration = (Date.now() - startTime) / 1000; + const _duration = (Date.now() - startTime) / 1000; expect(response.ok).toBe(true); const result = (await response.json()) as UploadResponse; - console.log(`\n⏱️ Results:`); - console.log(` Duration: ${duration.toFixed(1)}s`); - console.log(` Name: ${result.data.personalInfo.name || "N/A"}`); - console.log( - ` Job Experiences: ${result.data.jobExperiences?.length || 0}`, - ); - expect(result.success).toBe(true); } catch (error) { if ( @@ -326,7 +273,6 @@ describe("CV Upload Integration", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); } else { throw error; } @@ -389,37 +335,21 @@ describe("CV Upload Integration", () => { "code" in error && error.code === "ENOENT" ) { - console.log(` ⚠️ Skipping ${fileName}: not found`); } } } if (results.length > 0) { - console.log(`\n${"=".repeat(50)}`); - console.log(`📊 Performance Benchmark`); - console.log(`${"=".repeat(50)}`); - console.log(`${"File".padEnd(25)} | Duration | Status`); - console.log(`${"-".repeat(25)} | -------- | ------`); - for (const r of results) { - const status = r.success ? "✅" : "❌"; - console.log( - `${r.file.padEnd(25)} | ${r.duration.toFixed(1).padStart(6)}s | ${status}`, - ); + const _status = r.success ? "✅" : "❌"; } const successful = results.filter((r) => r.success); if (successful.length > 0) { - const avg = + const _avg = successful.reduce((sum, r) => sum + r.duration, 0) / successful.length; - console.log(`\nAverage: ${avg.toFixed(1)}s`); - - if (avg < 30) console.log(`🚀 GPU acceleration detected`); - else if (avg < 60) console.log(`✅ Acceptable performance`); - else console.log(`⚠️ Running on CPU`); } - console.log(`${"=".repeat(50)}\n`); } expect(results.some((r) => r.success)).toBe(true); diff --git a/apps/api/test/graphql-optimization.e2e-spec.ts b/apps/api/test/graphql-optimization.e2e-spec.ts index 38cfa64..3551240 100644 --- a/apps/api/test/graphql-optimization.e2e-spec.ts +++ b/apps/api/test/graphql-optimization.e2e-spec.ts @@ -1,6 +1,6 @@ import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, TestingModule } from "@nestjs/testing"; +import { Test, TestingModule } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "../src/modules/app.module"; import { diff --git a/apps/api/test/pdf-extraction.integration.ts b/apps/api/test/pdf-extraction.integration.ts index 5f43cf4..9ad3084 100644 --- a/apps/api/test/pdf-extraction.integration.ts +++ b/apps/api/test/pdf-extraction.integration.ts @@ -1,7 +1,6 @@ import { readdirSync, readFileSync } from "node:fs"; import { join } from "node:path"; -import { PdfExtractionStrategy } from "@cv/file-upload"; -import { PDFExtractor } from "@cv/file-upload"; +import { PDFExtractor, PdfExtractionStrategy } from "@cv/file-upload"; import { describe, expect, it } from "vitest"; /** @@ -56,23 +55,10 @@ describe("PDFExtractor (real-world CVs)", () => { const result = await extractor.extract(buffer); - console.log( - `[composite][${filename}] strategy=${extractor.lastUsedStrategy} | ${buffer.length} bytes -> success=${result.success}`, - ); - if (result.success) { const trimmed = result.text.trim(); - console.log( - `[composite][${filename}] ${trimmed.length} chars extracted`, - ); - console.log( - `[composite][${filename}] first 300 chars: ${trimmed.slice(0, 300)}`, - ); expect(trimmed.length).toBeGreaterThan(50); } else { - console.log( - `[composite][${filename}] extraction failed: ${result.error}`, - ); expect.fail(`Extraction failed for ${filename}: ${result.error}`); } }); @@ -86,12 +72,8 @@ describe("PDFExtractor (real-world CVs)", () => { const result = await strategy.extract(buffer); if (result.success) { - const trimmed = result.text.trim(); - console.log( - `[${strategyName}][${filename}] ${trimmed.length} chars | first 200: ${trimmed.slice(0, 200)}`, - ); + const _trimmed = result.text.trim(); } else { - console.log(`[${strategyName}][${filename}] failed: ${result.error}`); } // Log result but don't fail — individual strategies may legitimately fail diff --git a/apps/api/test/test-utils.ts b/apps/api/test/test-utils.ts index bf17285..7944a8b 100644 --- a/apps/api/test/test-utils.ts +++ b/apps/api/test/test-utils.ts @@ -1,6 +1,6 @@ import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, TestingModule } from "@nestjs/testing"; +import { Test, TestingModule } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "../src/modules/app.module"; import { REGISTER_MUTATION } from "./queries/load-queries"; diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts index 3a1c5ff..7d8be84 100644 --- a/apps/api/vitest.config.ts +++ b/apps/api/vitest.config.ts @@ -4,7 +4,7 @@ import { defineConfig } from "vitest/config"; export default defineConfig({ resolve: { alias: { - "@/": resolve(__dirname, "src") + "/", + "@/": `${resolve(__dirname, "src")}/`, }, }, test: { diff --git a/apps/worker/src/heartbeat/heartbeat.listener.ts b/apps/worker/src/heartbeat/heartbeat.listener.ts index 04b4313..b2af72d 100644 --- a/apps/worker/src/heartbeat/heartbeat.listener.ts +++ b/apps/worker/src/heartbeat/heartbeat.listener.ts @@ -5,8 +5,7 @@ import { WorkerStoppedEvent, } from "@riotbyte-com/project-q-core"; import { EventEmitter2 } from "eventemitter2"; -import { HeartbeatStrategy } from "./heartbeat.strategy"; -import { HEARTBEAT_STRATEGIES } from "./heartbeat.strategy"; +import { HEARTBEAT_STRATEGIES, HeartbeatStrategy } from "./heartbeat.strategy"; @Injectable() export class HeartbeatListener implements OnModuleInit { diff --git a/apps/worker/src/heartbeat/heartbeat.module.ts b/apps/worker/src/heartbeat/heartbeat.module.ts index ea24fbc..513b2cb 100644 --- a/apps/worker/src/heartbeat/heartbeat.module.ts +++ b/apps/worker/src/heartbeat/heartbeat.module.ts @@ -1,11 +1,9 @@ -import { DynamicModule } from "@nestjs/common"; -import { Module } from "@nestjs/common"; +import { DynamicModule, Module } from "@nestjs/common"; import { WorkerConfig } from "../config"; import { DbHeartbeatStrategy } from "./db-heartbeat.strategy"; import { FileHeartbeatStrategy } from "./file-heartbeat.strategy"; import { HeartbeatListener } from "./heartbeat.listener"; -import { HeartbeatStrategy } from "./heartbeat.strategy"; -import { HEARTBEAT_STRATEGIES } from "./heartbeat.strategy"; +import { HEARTBEAT_STRATEGIES, HeartbeatStrategy } from "./heartbeat.strategy"; @Module({}) export class HeartbeatModule { diff --git a/apps/worker/src/worker.module.ts b/apps/worker/src/worker.module.ts index b39f056..2a0ef70 100644 --- a/apps/worker/src/worker.module.ts +++ b/apps/worker/src/worker.module.ts @@ -4,8 +4,7 @@ import { HandlersModule } from "@cv/handlers"; import { Module } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; import { EventEmitterModule } from "@nestjs/event-emitter"; -import { WorkerConfig } from "./config"; -import { config } from "./config"; +import { config, WorkerConfig } from "./config"; import { HeartbeatModule } from "./heartbeat/heartbeat.module"; export const WORKER_CONFIG = Symbol("WORKER_CONFIG"); diff --git a/biome.json b/biome.json index bb7aad5..dd10cc7 100644 --- a/biome.json +++ b/biome.json @@ -1,5 +1,5 @@ { - "$schema": "https://biomejs.dev/schemas/2.2.6/schema.json", + "$schema": "https://biomejs.dev/schemas/2.3.11/schema.json", "files": { "includes": [ "apps/**/*", @@ -10,9 +10,9 @@ "!**/coverage", "!**/coverage-unit", "!**/generated", - "!**/generated/**", + "!**/generated", + "!apps/client/src/generated", "!apps/client/src/generated", - "!apps/client/src/generated/**", "!**/*.css" ], "ignoreUnknown": false diff --git a/packages/ai-parser/src/__tests__/ai-parser.service.spec.ts b/packages/ai-parser/src/__tests__/ai-parser.service.spec.ts index 7d2b620..f61e141 100644 --- a/packages/ai-parser/src/__tests__/ai-parser.service.spec.ts +++ b/packages/ai-parser/src/__tests__/ai-parser.service.spec.ts @@ -198,7 +198,7 @@ ${JSON.stringify(validParsedCVData)} expect(result.personalInfo).toEqual({}); expect(result.jobExperiences).toHaveLength(1); - expect(result.jobExperiences[0]!.skills).toEqual([]); + expect(result.jobExperiences[0]?.skills).toEqual([]); expect(result.education).toEqual([]); expect(result.skills).toEqual([]); }); @@ -222,7 +222,7 @@ ${JSON.stringify(validParsedCVData)} const result = await service.parseCVText("Sample CV text"); - expect(result.jobExperiences[0]!.endDate).toBeNull(); + expect(result.jobExperiences[0]?.endDate).toBeNull(); }); it("trims whitespace from optional string fields", async () => { @@ -251,8 +251,8 @@ ${JSON.stringify(validParsedCVData)} expect(result.personalInfo.name).toBe("John Doe"); expect(result.personalInfo.introduction).toBe("Senior developer"); - expect(result.jobExperiences[0]!.levelName).toBe("Senior"); - expect(result.jobExperiences[0]!.description).toBe("Led team"); + expect(result.jobExperiences[0]?.levelName).toBe("Senior"); + expect(result.jobExperiences[0]?.description).toBe("Led team"); }); }); @@ -359,7 +359,7 @@ ${JSON.stringify(validParsedCVData)} skills: ["TypeScript", "React"], }); - const calledWith = mockProvider.complete.mock.calls[0]![0]; + const calledWith = mockProvider.complete.mock.calls[0]?.[0]; expect(calledWith.prompt).toContain("Jane Smith"); expect(calledWith.prompt).toContain("ACME"); expect(calledWith.prompt).toContain("TypeScript, React"); @@ -374,7 +374,7 @@ ${JSON.stringify(validParsedCVData)} await service.parseCVText("Sample CV"); - const calledWith = mockProvider.complete.mock.calls[0]![0]; + const calledWith = mockProvider.complete.mock.calls[0]?.[0]; expect(calledWith.prompt).not.toContain("Existing User Data"); }); diff --git a/packages/ai-parser/src/ai-parser.service.test.ts b/packages/ai-parser/src/ai-parser.service.test.ts index 2a669a1..3758762 100644 --- a/packages/ai-parser/src/ai-parser.service.test.ts +++ b/packages/ai-parser/src/ai-parser.service.test.ts @@ -125,8 +125,8 @@ describe("CVParserService Unit Tests", () => { expect(result.personalInfo.name).toBe("John Doe"); expect(result.jobExperiences).toHaveLength(1); - expect(result.jobExperiences[0]!.companyName).toBe("Tech Corp"); - expect(result.jobExperiences[0]!.endDate).toBeNull(); + expect(result.jobExperiences[0]?.companyName).toBe("Tech Corp"); + expect(result.jobExperiences[0]?.endDate).toBeNull(); expect(result.education).toHaveLength(1); expect(result.skills).toHaveLength(4); }); diff --git a/packages/ai-parser/src/cv-parser.module.ts b/packages/ai-parser/src/cv-parser.module.ts index 5c4c979..61403e8 100644 --- a/packages/ai-parser/src/cv-parser.module.ts +++ b/packages/ai-parser/src/cv-parser.module.ts @@ -1,5 +1,9 @@ import { - AI_PROVIDER, AIModule, AIModuleOptions, AIProvider, } from "@cv/ai-provider"; + AI_PROVIDER, + AIModule, + AIModuleOptions, + AIProvider, +} from "@cv/ai-provider"; import { DynamicModule, Module } from "@nestjs/common"; import { CVParserService } from "./ai-parser.service"; diff --git a/packages/ai-provider/src/ai-provider.registry.ts b/packages/ai-provider/src/ai-provider.registry.ts index 96e8129..99ecb0a 100644 --- a/packages/ai-provider/src/ai-provider.registry.ts +++ b/packages/ai-provider/src/ai-provider.registry.ts @@ -17,7 +17,6 @@ export const registerAIProvider = ( }; interface AIProviderStatic { - new (...args: any[]): AIProvider; fromConfigService(configService: ConfigService): AIProvider; } diff --git a/packages/ai-provider/src/providers/base.provider.ts b/packages/ai-provider/src/providers/base.provider.ts index 9737f88..9056be2 100644 --- a/packages/ai-provider/src/providers/base.provider.ts +++ b/packages/ai-provider/src/providers/base.provider.ts @@ -1,5 +1,11 @@ import { z } from "zod/v4"; -import { AICompletionRequest, AICompletionResponse, AIProvider, AIProviderConfig, AIProviderStatus } from "../types"; +import { + AICompletionRequest, + AICompletionResponse, + AIProvider, + AIProviderConfig, + AIProviderStatus, +} from "../types"; /** * Options for the `request()` helper. @@ -77,7 +83,7 @@ export abstract class BaseAIProvider implements AIProvider { const response = await fetch(`${this.baseUrl}${path}`, { method: options?.method ?? (hasBody ? "POST" : "GET"), headers, - ...(hasBody ? { body: JSON.stringify(options!.body) } : {}), + ...(hasBody ? { body: JSON.stringify(options?.body) } : {}), signal: controller.signal, }); diff --git a/packages/core/package.json b/packages/core/package.json index 9b088cd..7a9f5b7 100644 --- a/packages/core/package.json +++ b/packages/core/package.json @@ -5,7 +5,11 @@ "main": "./src/index.ts", "types": "./src/index.ts", "imports": { - "#core/*": ["./src/*", "./src/*/index.ts", "./src/*.ts"] + "#core/*": [ + "./src/*", + "./src/*/index.ts", + "./src/*.ts" + ] }, "scripts": { "test": "vitest run", diff --git a/packages/core/src/modules/application/application-status/application-status.module.ts b/packages/core/src/modules/application/application-status/application-status.module.ts index 4aa07d7..0c0b487 100644 --- a/packages/core/src/modules/application/application-status/application-status.module.ts +++ b/packages/core/src/modules/application/application-status/application-status.module.ts @@ -1,6 +1,6 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { ApplicationStatusFactory } from "./application-status.factory"; import { ApplicationStatusMapper } from "./application-status.mapper"; import { ApplicationStatusService } from "./application-status.service"; diff --git a/packages/core/src/modules/application/application-status/application-status.service.ts b/packages/core/src/modules/application/application-status/application-status.service.ts index 11e6d9b..981da49 100644 --- a/packages/core/src/modules/application/application-status/application-status.service.ts +++ b/packages/core/src/modules/application/application-status/application-status.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { ApplicationStatus } from "./application-status.entity"; import { ApplicationStatusMapper } from "./application-status.mapper"; diff --git a/packages/core/src/modules/application/application.mapper.ts b/packages/core/src/modules/application/application.mapper.ts index 8bec0a9..8ed6f50 100644 --- a/packages/core/src/modules/application/application.mapper.ts +++ b/packages/core/src/modules/application/application.mapper.ts @@ -2,10 +2,7 @@ import { Injectable } from "@nestjs/common"; import { Prisma } from "@prisma/client"; import { cvMapper } from "../cv-template/cv.mapper"; import { VacancyMapper } from "../vacancies/vacancy.mapper"; -import { - Application, - ApplicationStatusRelation, -} from "./application.entity"; +import { Application, ApplicationStatusRelation } from "./application.entity"; type PrismaApplicationWithRelations = Prisma.ApplicationGetPayload<{ include: { diff --git a/packages/core/src/modules/auth/__tests__/password-identity-provider.spec.ts b/packages/core/src/modules/auth/__tests__/password-identity-provider.spec.ts index 75ede77..89226f9 100644 --- a/packages/core/src/modules/auth/__tests__/password-identity-provider.spec.ts +++ b/packages/core/src/modules/auth/__tests__/password-identity-provider.spec.ts @@ -14,7 +14,8 @@ const { InvalidCredentialsError } = await import( const { PasswordIdentityProvider } = await import( "../providers/password/password-identity-provider" ); -type CredentialsService = import("../user/credentials.service").CredentialsService; +type CredentialsService = + import("../user/credentials.service").CredentialsService; const buildProvider = (overrides: Partial = {}) => { const credentialsService = { diff --git a/packages/core/src/modules/auth/providers/password/credentials/templated-email.service.ts b/packages/core/src/modules/auth/providers/password/credentials/templated-email.service.ts index 8471bb1..3feb6c0 100644 --- a/packages/core/src/modules/auth/providers/password/credentials/templated-email.service.ts +++ b/packages/core/src/modules/auth/providers/password/credentials/templated-email.service.ts @@ -1,5 +1,9 @@ import { - HANDLEBARS_TEMPLATE_SERVICE_TOKEN, HandlebarsTemplateService, MAIL_SERVICE_TOKEN, type MailService, } from "@cv/mail"; + HANDLEBARS_TEMPLATE_SERVICE_TOKEN, + HandlebarsTemplateService, + MAIL_SERVICE_TOKEN, + type MailService, +} from "@cv/mail"; import { Inject, Injectable } from "@nestjs/common"; import { EMAIL_CONFIG_TOKEN, EmailConfig } from "./email.config"; diff --git a/packages/core/src/modules/auth/providers/password/password-identity-provider.ts b/packages/core/src/modules/auth/providers/password/password-identity-provider.ts index 3ee6897..2f4c795 100644 --- a/packages/core/src/modules/auth/providers/password/password-identity-provider.ts +++ b/packages/core/src/modules/auth/providers/password/password-identity-provider.ts @@ -1,10 +1,10 @@ import { Injectable } from "@nestjs/common"; import * as bcrypt from "bcryptjs"; -import { IdentityProviderDecorator } from "../.."; import { InvalidCredentialsError } from "#core/modules/auth/errors/authentication.error"; import { IdentityProvider as IIdentityProvider } from "#core/modules/auth/identity-provider.interface"; import { CredentialsService } from "#core/modules/auth/user/credentials.service"; import { User } from "#core/modules/auth/user/user.entity"; +import { IdentityProviderDecorator } from "../.."; export const PASSWORD_PROVIDER_NAME = Symbol("password"); @@ -77,4 +77,3 @@ export class PasswordIdentityProvider implements IIdentityProvider { return { email, password }; } } - diff --git a/packages/core/src/modules/auth/providers/password/password-provider.module.ts b/packages/core/src/modules/auth/providers/password/password-provider.module.ts index 5cd963d..445c700 100644 --- a/packages/core/src/modules/auth/providers/password/password-provider.module.ts +++ b/packages/core/src/modules/auth/providers/password/password-provider.module.ts @@ -68,4 +68,3 @@ export class PasswordProviderModule implements OnModuleInit { this.templateRegistry.registerDirectory(templatesPath); } } - diff --git a/packages/core/src/modules/cv-template/cv-renderer.service.ts b/packages/core/src/modules/cv-template/cv-renderer.service.ts index c0ddb15..9d3d34f 100644 --- a/packages/core/src/modules/cv-template/cv-renderer.service.ts +++ b/packages/core/src/modules/cv-template/cv-renderer.service.ts @@ -1,11 +1,14 @@ import { - HandlebarsEngine, TemplateEngine, wrapInDocument, } from "@cv/cv-renderer"; + HandlebarsEngine, + TemplateEngine, + wrapInDocument, +} from "@cv/cv-renderer"; import { Injectable } from "@nestjs/common"; import type { MessageBus } from "@riotbyte-com/project-q-core"; import { InjectMessageBus } from "@riotbyte-com/project-q-nestjs"; import { RenderPdfMessage } from "../messenger/messages/render-pdf.message"; -import { CVDataAssemblerService } from "./cv-data-assembler.service"; import { CVService } from "./cv.service"; +import { CVDataAssemblerService } from "./cv-data-assembler.service"; import { CVTemplateService } from "./cv-template.service"; const engines: Record = { diff --git a/packages/core/src/modules/cv-template/cv.mapper.ts b/packages/core/src/modules/cv-template/cv.mapper.ts index aa6d77b..021f7ee 100644 --- a/packages/core/src/modules/cv-template/cv.mapper.ts +++ b/packages/core/src/modules/cv-template/cv.mapper.ts @@ -1,7 +1,4 @@ -import { - CV as PrismaCV, - CVTemplate as PrismaCVTemplate, -} from "@prisma/client"; +import { CV as PrismaCV, CVTemplate as PrismaCVTemplate } from "@prisma/client"; import { CV } from "./cv.entity"; import { cvTemplateMapper } from "./cv-template.mapper"; diff --git a/packages/core/src/modules/cv-template/cv.policy.ts b/packages/core/src/modules/cv-template/cv.policy.ts index 7b0059f..d07ffee 100644 --- a/packages/core/src/modules/cv-template/cv.policy.ts +++ b/packages/core/src/modules/cv-template/cv.policy.ts @@ -1,12 +1,7 @@ import { Injectable } from "@nestjs/common"; import { Policy, ProfileOwnedResourcePolicy } from "../auth"; -import { PrismaService } from "../database"; import { CV } from "./cv.entity"; @Injectable() @Policy(CV) -export class CVPolicy extends ProfileOwnedResourcePolicy { - constructor(prisma: PrismaService) { - super(prisma); - } -} +export class CVPolicy extends ProfileOwnedResourcePolicy {} diff --git a/packages/core/src/modules/cv-template/cv.service.ts b/packages/core/src/modules/cv-template/cv.service.ts index 66b8d32..e4fd815 100644 --- a/packages/core/src/modules/cv-template/cv.service.ts +++ b/packages/core/src/modules/cv-template/cv.service.ts @@ -1,6 +1,11 @@ import { Injectable } from "@nestjs/common"; import { Prisma } from "@prisma/client"; -import { EntityService, PaginationOptions, PaginationResult, PaginationService } from "#core/shared"; +import { + EntityService, + PaginationOptions, + PaginationResult, + PaginationService, +} from "#core/shared"; import { notFound } from "../auth"; import { PrismaService } from "../database"; import { CV } from "./cv.entity"; diff --git a/packages/core/src/modules/database/index.ts b/packages/core/src/modules/database/index.ts index 2916a77..e8d2298 100644 --- a/packages/core/src/modules/database/index.ts +++ b/packages/core/src/modules/database/index.ts @@ -3,9 +3,9 @@ export type { TypedPrismaService } from "./prisma.service"; export * from "./prisma.service"; export { type Seeder, SeedService } from "./seed/seed.service"; export { - type SeederConfig, SEEDER_METADATA_KEY, Seeder as SeederDecorator, + type SeederConfig, } from "./seed/seeder.decorator"; -export { topologicalSort } from "./seed/topological-sort"; export { ReferenceDataSeedService } from "./seed/seeders/reference-data.seed"; +export { topologicalSort } from "./seed/topological-sort"; diff --git a/packages/core/src/modules/database/seed/seed.service.ts b/packages/core/src/modules/database/seed/seed.service.ts index 8a36eaf..58cdfcd 100644 --- a/packages/core/src/modules/database/seed/seed.service.ts +++ b/packages/core/src/modules/database/seed/seed.service.ts @@ -1,8 +1,7 @@ import { Injectable, Logger, type OnModuleInit } from "@nestjs/common"; import { DiscoveryService } from "@nestjs/core"; import { PrismaService } from "../prisma.service"; -import { SeederConfig } from "./seeder.decorator"; -import { SEEDER_METADATA_KEY } from "./seeder.decorator"; +import { SEEDER_METADATA_KEY, SeederConfig } from "./seeder.decorator"; import { topologicalSort } from "./topological-sort"; export interface Seeder { diff --git a/packages/core/src/modules/database/seed/topological-sort.ts b/packages/core/src/modules/database/seed/topological-sort.ts index 448b181..0f26879 100644 --- a/packages/core/src/modules/database/seed/topological-sort.ts +++ b/packages/core/src/modules/database/seed/topological-sort.ts @@ -1,3 +1,5 @@ +import { raise } from "#core/shared"; + /** * Topologically sorts nodes using Kahn's algorithm. * Returns sorted order or the cycle that prevents resolution. @@ -28,8 +30,11 @@ export const topologicalSort = ( nodes.forEach((n) => { n.dependsOn.forEach((dep) => { - adjacency.get(dep)!.push(n.name); - inDegree.set(n.name, inDegree.get(n.name)! + 1); + adjacency.get(dep)?.push(n.name); + inDegree.set( + n.name, + (inDegree.get(n.name) ?? raise(`invariant: ${n.name} not seeded`)) + 1, + ); }); }); @@ -40,11 +45,20 @@ export const topologicalSort = ( const sorted: Array<{ name: string; value: T }> = []; while (queue.length > 0) { - const current = queue.shift()!; - sorted.push({ name: current, value: valueMap.get(current)! }); + const current = + queue.shift() ?? raise("invariant: queue non-empty by loop guard"); + sorted.push({ + name: current, + value: + valueMap.get(current) ?? raise(`invariant: no value for ${current}`), + }); - for (const neighbor of adjacency.get(current)!) { - const newDegree = inDegree.get(neighbor)! - 1; + const neighbors = + adjacency.get(current) ?? raise(`invariant: no adjacency for ${current}`); + for (const neighbor of neighbors) { + const newDegree = + (inDegree.get(neighbor) ?? + raise(`invariant: no in-degree for ${neighbor}`)) - 1; inDegree.set(neighbor, newDegree); if (newDegree === 0) queue.push(neighbor); } @@ -52,7 +66,11 @@ export const topologicalSort = ( if (sorted.length !== nodes.length) { const cycle = nodes - .filter((n) => inDegree.get(n.name)! > 0) + .filter( + (n) => + (inDegree.get(n.name) ?? + raise(`invariant: no in-degree for ${n.name}`)) > 0, + ) .map((n) => n.name); return { cycle }; } diff --git a/packages/core/src/modules/education/education.policy.ts b/packages/core/src/modules/education/education.policy.ts index d8ff948..dd42bbe 100644 --- a/packages/core/src/modules/education/education.policy.ts +++ b/packages/core/src/modules/education/education.policy.ts @@ -1,12 +1,7 @@ import { Injectable } from "@nestjs/common"; import { Policy, ProfileOwnedResourcePolicy } from "../auth"; -import { PrismaService } from "../database"; import { Education } from "./education.entity"; @Injectable() @Policy(Education) -export class EducationPolicy extends ProfileOwnedResourcePolicy { - constructor(prisma: PrismaService) { - super(prisma); - } -} +export class EducationPolicy extends ProfileOwnedResourcePolicy {} diff --git a/packages/core/src/modules/education/education.service.ts b/packages/core/src/modules/education/education.service.ts index 9d3d60f..ee9ff34 100644 --- a/packages/core/src/modules/education/education.service.ts +++ b/packages/core/src/modules/education/education.service.ts @@ -1,6 +1,10 @@ import { Injectable } from "@nestjs/common"; import { Prisma } from "@prisma/client"; -import { PaginationOptions, PaginationResult, PaginationService } from "#core/shared"; +import { + PaginationOptions, + PaginationResult, + PaginationService, +} from "#core/shared"; import { notFound } from "../auth"; import { PrismaService } from "../database"; import { Education } from "./education.entity"; diff --git a/packages/core/src/modules/job-experience/company/company.module.ts b/packages/core/src/modules/job-experience/company/company.module.ts index 1c34e52..bafc7d4 100644 --- a/packages/core/src/modules/job-experience/company/company.module.ts +++ b/packages/core/src/modules/job-experience/company/company.module.ts @@ -1,8 +1,8 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { AuthorizationModule } from "#core/modules/auth"; import { AuthenticationModule } from "#core/modules/authentication/authentication.module"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { CompanyDataLoaderService } from "./company.dataloader"; import { CompanyFactory } from "./company.factory"; import { CompanyMapper } from "./company.mapper"; diff --git a/packages/core/src/modules/job-experience/company/company.service.ts b/packages/core/src/modules/job-experience/company/company.service.ts index e68a5ac..6a4ecd0 100644 --- a/packages/core/src/modules/job-experience/company/company.service.ts +++ b/packages/core/src/modules/job-experience/company/company.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { Company } from "./company.entity"; import { CompanyMapper } from "./company.mapper"; diff --git a/packages/core/src/modules/job-experience/employment/employment.module.ts b/packages/core/src/modules/job-experience/employment/employment.module.ts index 7985889..cc482f3 100644 --- a/packages/core/src/modules/job-experience/employment/employment.module.ts +++ b/packages/core/src/modules/job-experience/employment/employment.module.ts @@ -1,8 +1,8 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { AuthorizationModule } from "#core/modules/auth"; import { AuthenticationModule } from "#core/modules/authentication/authentication.module"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { CompanyModule } from "../company/company.module"; import { LevelModule } from "../level/level.module"; import { RoleModule } from "../role/role.module"; diff --git a/packages/core/src/modules/job-experience/employment/user-job-experience.policy.ts b/packages/core/src/modules/job-experience/employment/user-job-experience.policy.ts index bfe9e32..f53ca90 100644 --- a/packages/core/src/modules/job-experience/employment/user-job-experience.policy.ts +++ b/packages/core/src/modules/job-experience/employment/user-job-experience.policy.ts @@ -1,12 +1,7 @@ import { Injectable } from "@nestjs/common"; import { Policy, ProfileOwnedResourcePolicy } from "#core/modules/auth"; -import { PrismaService } from "#core/modules/database"; import { UserJobExperience } from "./user-job-experience.entity"; @Injectable() @Policy(UserJobExperience) -export class UserJobExperiencePolicy extends ProfileOwnedResourcePolicy { - constructor(prisma: PrismaService) { - super(prisma); - } -} +export class UserJobExperiencePolicy extends ProfileOwnedResourcePolicy {} diff --git a/packages/core/src/modules/job-experience/employment/user-job-experience.service.ts b/packages/core/src/modules/job-experience/employment/user-job-experience.service.ts index e8daca6..6a5ef7a 100644 --- a/packages/core/src/modules/job-experience/employment/user-job-experience.service.ts +++ b/packages/core/src/modules/job-experience/employment/user-job-experience.service.ts @@ -1,8 +1,12 @@ import { Injectable } from "@nestjs/common"; import { Prisma } from "@prisma/client"; -import { PaginationOptions, PaginationResult, PaginationService } from "#core/shared"; import { notFound } from "#core/modules/auth"; import { PrismaService } from "#core/modules/database"; +import { + PaginationOptions, + PaginationResult, + PaginationService, +} from "#core/shared"; import { CreateUserJobExperienceDto, UpdateUserJobExperienceDto, diff --git a/packages/core/src/modules/job-experience/level/level.module.ts b/packages/core/src/modules/job-experience/level/level.module.ts index 2bb5675..6dc7670 100644 --- a/packages/core/src/modules/job-experience/level/level.module.ts +++ b/packages/core/src/modules/job-experience/level/level.module.ts @@ -1,8 +1,8 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { AuthorizationModule } from "#core/modules/auth"; import { AuthenticationModule } from "#core/modules/authentication/authentication.module"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { LevelDataLoaderService } from "./level.dataloader"; import { LevelFactory } from "./level.factory"; import { LevelMapper } from "./level.mapper"; diff --git a/packages/core/src/modules/job-experience/level/level.service.ts b/packages/core/src/modules/job-experience/level/level.service.ts index 18d9853..eddeb2a 100644 --- a/packages/core/src/modules/job-experience/level/level.service.ts +++ b/packages/core/src/modules/job-experience/level/level.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { Level } from "./level.entity"; import { LevelMapper } from "./level.mapper"; diff --git a/packages/core/src/modules/job-experience/role/role.module.ts b/packages/core/src/modules/job-experience/role/role.module.ts index b669512..7ffec51 100644 --- a/packages/core/src/modules/job-experience/role/role.module.ts +++ b/packages/core/src/modules/job-experience/role/role.module.ts @@ -1,8 +1,8 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { AuthorizationModule } from "#core/modules/auth"; import { AuthenticationModule } from "#core/modules/authentication/authentication.module"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { RoleDataLoaderService } from "./role.dataloader"; import { RoleFactory } from "./role.factory"; import { RoleMapper } from "./role.mapper"; diff --git a/packages/core/src/modules/job-experience/role/role.service.ts b/packages/core/src/modules/job-experience/role/role.service.ts index 41d50d1..5bba133 100644 --- a/packages/core/src/modules/job-experience/role/role.service.ts +++ b/packages/core/src/modules/job-experience/role/role.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { Role } from "./role.entity"; import { RoleMapper } from "./role.mapper"; diff --git a/packages/core/src/modules/job-experience/skill/skill.module.ts b/packages/core/src/modules/job-experience/skill/skill.module.ts index 54eb562..4038945 100644 --- a/packages/core/src/modules/job-experience/skill/skill.module.ts +++ b/packages/core/src/modules/job-experience/skill/skill.module.ts @@ -1,8 +1,8 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { AuthorizationModule } from "#core/modules/auth"; import { AuthenticationModule } from "#core/modules/authentication/authentication.module"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { SkillFactory } from "./skill.factory"; import { SkillMapper } from "./skill.mapper"; import { SkillPolicy } from "./skill.policy"; diff --git a/packages/core/src/modules/job-experience/skill/skill.service.ts b/packages/core/src/modules/job-experience/skill/skill.service.ts index c8b40ce..ad4bf25 100644 --- a/packages/core/src/modules/job-experience/skill/skill.service.ts +++ b/packages/core/src/modules/job-experience/skill/skill.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityFilters, NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityFilters, NamedEntityService } from "#core/shared"; import { Skill } from "./skill.entity"; import { SkillMapper } from "./skill.mapper"; diff --git a/packages/core/src/modules/messenger/index.ts b/packages/core/src/modules/messenger/index.ts index 89130ea..93d96b9 100644 --- a/packages/core/src/modules/messenger/index.ts +++ b/packages/core/src/modules/messenger/index.ts @@ -1,13 +1,13 @@ -export { - ProjectQMessagingModule, - type ProjectQMessagingOptions, -} from "./messenger.module"; -export { NestProjectQLogger } from "./logger.provider"; -export { PrismaTransportModule } from "./prisma-transport.module"; -export { RenderPdfMessage } from "./messages/render-pdf.message"; // Re-exports so apps don't need a direct dep on @riotbyte-com/project-q-*. export type { Envelope, MessageBus } from "@riotbyte-com/project-q-core"; export { HandlerTag, InjectMessageBus, } from "@riotbyte-com/project-q-nestjs"; +export { NestProjectQLogger } from "./logger.provider"; +export { RenderPdfMessage } from "./messages/render-pdf.message"; +export { + ProjectQMessagingModule, + type ProjectQMessagingOptions, +} from "./messenger.module"; +export { PrismaTransportModule } from "./prisma-transport.module"; diff --git a/packages/core/src/modules/profile/profile.service.ts b/packages/core/src/modules/profile/profile.service.ts index 29bc19f..d2f665e 100644 --- a/packages/core/src/modules/profile/profile.service.ts +++ b/packages/core/src/modules/profile/profile.service.ts @@ -1,5 +1,5 @@ import { Injectable, NotFoundException } from "@nestjs/common"; -import { TokenEncryptionService, User } from "../auth"; +import { TokenEncryptionService } from "../auth"; import { PrismaService } from "../database"; interface CreateProfileInput { diff --git a/packages/core/src/modules/vacancies/contract-type/contract-type.service.ts b/packages/core/src/modules/vacancies/contract-type/contract-type.service.ts index c8b2944..aad9db1 100644 --- a/packages/core/src/modules/vacancies/contract-type/contract-type.service.ts +++ b/packages/core/src/modules/vacancies/contract-type/contract-type.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { ContractType } from "./contract-type.entity"; import { ContractTypeMapper } from "./contract-type.mapper"; diff --git a/packages/core/src/modules/vacancies/job-type/job-type.factory.ts b/packages/core/src/modules/vacancies/job-type/job-type.factory.ts index 8ce1a03..fba67b1 100644 --- a/packages/core/src/modules/vacancies/job-type/job-type.factory.ts +++ b/packages/core/src/modules/vacancies/job-type/job-type.factory.ts @@ -1,9 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { - ClockService, - Factory, - UuidFactoryService, -} from "#core/shared"; +import { ClockService, Factory, UuidFactoryService } from "#core/shared"; import { CreateJobTypeDto } from "./job-type.dto"; import { JobType } from "./job-type.entity"; diff --git a/packages/core/src/modules/vacancies/job-type/job-type.module.ts b/packages/core/src/modules/vacancies/job-type/job-type.module.ts index b7c7960..767c78b 100644 --- a/packages/core/src/modules/vacancies/job-type/job-type.module.ts +++ b/packages/core/src/modules/vacancies/job-type/job-type.module.ts @@ -1,6 +1,6 @@ import { Module } from "@nestjs/common"; -import { BaseModule } from "#core/shared"; import { DatabaseModule } from "#core/modules/database"; +import { BaseModule } from "#core/shared"; import { JobTypeFactory } from "./job-type.factory"; import { JobTypeMapper } from "./job-type.mapper"; import { JobTypeService } from "./job-type.service"; diff --git a/packages/core/src/modules/vacancies/job-type/job-type.service.ts b/packages/core/src/modules/vacancies/job-type/job-type.service.ts index 78f566d..585d54a 100644 --- a/packages/core/src/modules/vacancies/job-type/job-type.service.ts +++ b/packages/core/src/modules/vacancies/job-type/job-type.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { JobType } from "./job-type.entity"; import { JobTypeMapper } from "./job-type.mapper"; diff --git a/packages/core/src/modules/vacancies/rate-type/rate-type.service.ts b/packages/core/src/modules/vacancies/rate-type/rate-type.service.ts index 673d7f6..5272e64 100644 --- a/packages/core/src/modules/vacancies/rate-type/rate-type.service.ts +++ b/packages/core/src/modules/vacancies/rate-type/rate-type.service.ts @@ -1,6 +1,6 @@ import { Injectable } from "@nestjs/common"; -import { NamedEntityService } from "#core/shared"; import { PrismaService } from "#core/modules/database"; +import { NamedEntityService } from "#core/shared"; import { RateType } from "./rate-type.entity"; import { RateTypeMapper } from "./rate-type.mapper"; diff --git a/packages/core/src/modules/vacancies/vacancy.policy.ts b/packages/core/src/modules/vacancies/vacancy.policy.ts index 6bd577a..c52a0e1 100644 --- a/packages/core/src/modules/vacancies/vacancy.policy.ts +++ b/packages/core/src/modules/vacancies/vacancy.policy.ts @@ -1,6 +1,5 @@ import { Injectable } from "@nestjs/common"; -import { User } from "../auth"; -import { OwnerOwnedResourcePolicy, Policy } from "../auth"; +import { OwnerOwnedResourcePolicy, Policy, User } from "../auth"; import { Vacancy } from "./vacancy.entity"; @Injectable() diff --git a/packages/core/src/modules/vacancies/vacancy.service.ts b/packages/core/src/modules/vacancies/vacancy.service.ts index a666ca8..603a068 100644 --- a/packages/core/src/modules/vacancies/vacancy.service.ts +++ b/packages/core/src/modules/vacancies/vacancy.service.ts @@ -1,7 +1,7 @@ import { ensureArray } from "@cv/utils"; import { Injectable } from "@nestjs/common"; import { Prisma } from "@prisma/client"; -import { EntityService, raise } from "#core/shared"; +import { EntityService, raise } from "#core/shared"; import { notFound } from "../auth"; import { PrismaService } from "../database"; import { Vacancy } from "./vacancy.entity"; diff --git a/packages/file-storage/src/file-storage.module.ts b/packages/file-storage/src/file-storage.module.ts index f707f1c..7cc9dc2 100644 --- a/packages/file-storage/src/file-storage.module.ts +++ b/packages/file-storage/src/file-storage.module.ts @@ -1,4 +1,4 @@ -import { DynamicModule, Module, type Type } from "@nestjs/common"; +import { DynamicModule, Module, type Type } from "@nestjs/common"; import { DiskFileStorage } from "./disk-file-storage"; import { FILE_STORAGE } from "./file-storage.interface"; import { R2FileStorage, R2FileStorageConfig } from "./r2-file-storage"; diff --git a/packages/file-upload/src/__tests__/pdf-extraction.integration.test.ts b/packages/file-upload/src/__tests__/pdf-extraction.integration.test.ts index a8dcf49..9794148 100644 --- a/packages/file-upload/src/__tests__/pdf-extraction.integration.test.ts +++ b/packages/file-upload/src/__tests__/pdf-extraction.integration.test.ts @@ -29,10 +29,6 @@ describe("PDFExtractor (real-world CVs)", () => { if (!result.success) return; const trimmed = result.text.trim(); - console.log( - `[${filename}] strategy=${extractor.lastUsedStrategy} | ${buffer.length} bytes -> ${trimmed.length} chars`, - ); - console.log(`[${filename}] first 200 chars: ${trimmed.slice(0, 200)}`); expect(trimmed.length).toBeGreaterThan(0); }); diff --git a/packages/file-upload/src/extractors/docx.extractor.ts b/packages/file-upload/src/extractors/docx.extractor.ts index cb7b2f5..832a6d6 100644 --- a/packages/file-upload/src/extractors/docx.extractor.ts +++ b/packages/file-upload/src/extractors/docx.extractor.ts @@ -1,6 +1,6 @@ import * as mammoth from "mammoth"; -import type { TextExtractionResult } from "../types"; import { TextExtractorProvider } from "../text-extractor.tag"; +import type { TextExtractionResult } from "../types"; import { BaseTextExtractor } from "./base-extractor"; import { withTimeout, withZipBombGuard } from "./middleware"; diff --git a/packages/file-upload/src/extractors/middleware.ts b/packages/file-upload/src/extractors/middleware.ts index 67145fc..c70c18f 100644 --- a/packages/file-upload/src/extractors/middleware.ts +++ b/packages/file-upload/src/extractors/middleware.ts @@ -1,6 +1,6 @@ -import { inspectZipForBombs } from "./zip-bomb-guard"; import type { TextExtractionResult } from "../types"; import { withTimeout as runWithTimeout } from "./with-timeout"; +import { inspectZipForBombs } from "./zip-bomb-guard"; export type Extract = (buffer: Buffer) => Promise; diff --git a/packages/file-upload/src/extractors/pdf/pdf.extractor.ts b/packages/file-upload/src/extractors/pdf/pdf.extractor.ts index 223103c..a9f9465 100644 --- a/packages/file-upload/src/extractors/pdf/pdf.extractor.ts +++ b/packages/file-upload/src/extractors/pdf/pdf.extractor.ts @@ -1,7 +1,7 @@ import { Logger } from "@nestjs/common"; -import type { TextExtractionResult } from "#file-upload/types"; import { BaseTextExtractor } from "#file-upload/extractors/base-extractor"; import { TextExtractorProvider } from "#file-upload/text-extractor.tag"; +import type { TextExtractionResult } from "#file-upload/types"; import { PdfParseStrategy } from "./strategies/pdf-parse.strategy"; import { Pdf2JsonStrategy } from "./strategies/pdf2json.strategy"; import { TesseractOcrStrategy } from "./strategies/tesseract-ocr.strategy"; diff --git a/packages/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy.ts b/packages/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy.ts index 075e265..263a75b 100644 --- a/packages/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy.ts +++ b/packages/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy.ts @@ -1,5 +1,5 @@ -import { TextExtractionResult } from "#file-upload/types"; import { withTimeout } from "#file-upload/extractors/with-timeout"; +import { TextExtractionResult } from "#file-upload/types"; import { PdfExtractionStrategy } from "../types"; // eslint-disable-next-line @typescript-eslint/no-require-imports diff --git a/packages/file-upload/src/extractors/pdf/strategies/pdf2json.strategy.ts b/packages/file-upload/src/extractors/pdf/strategies/pdf2json.strategy.ts index 8a8e5a4..b61a121 100644 --- a/packages/file-upload/src/extractors/pdf/strategies/pdf2json.strategy.ts +++ b/packages/file-upload/src/extractors/pdf/strategies/pdf2json.strategy.ts @@ -1,5 +1,5 @@ -import { TextExtractionResult } from "#file-upload/types"; import { withTimeout } from "#file-upload/extractors/with-timeout"; +import { TextExtractionResult } from "#file-upload/types"; import { PdfExtractionStrategy } from "../types"; /** diff --git a/packages/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy.ts b/packages/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy.ts index 8720790..f0e434a 100644 --- a/packages/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy.ts +++ b/packages/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy.ts @@ -1,5 +1,5 @@ -import { TextExtractionResult } from "#file-upload/types"; import { withTimeout } from "#file-upload/extractors/with-timeout"; +import { TextExtractionResult } from "#file-upload/types"; import { PdfExtractionStrategy } from "../types"; const OCR_TIMEOUT_MS = 60_000; diff --git a/packages/file-upload/src/extractors/plain-text.extractor.ts b/packages/file-upload/src/extractors/plain-text.extractor.ts index 555f7a7..03d2731 100644 --- a/packages/file-upload/src/extractors/plain-text.extractor.ts +++ b/packages/file-upload/src/extractors/plain-text.extractor.ts @@ -1,5 +1,5 @@ -import type { TextExtractionResult } from "../types"; import { TextExtractorProvider } from "../text-extractor.tag"; +import type { TextExtractionResult } from "../types"; import { BaseTextExtractor } from "./base-extractor"; @TextExtractorProvider() diff --git a/packages/file-upload/src/extractors/zip-bomb-guard.ts b/packages/file-upload/src/extractors/zip-bomb-guard.ts index af0ac58..f6fdb6a 100644 --- a/packages/file-upload/src/extractors/zip-bomb-guard.ts +++ b/packages/file-upload/src/extractors/zip-bomb-guard.ts @@ -42,7 +42,10 @@ const findEocdOffset = (buffer: Buffer): number => { export const inspectZipForBombs = (buffer: Buffer): ZipBombGuardResult => { if (buffer.length < EOCD_MIN_LENGTH) { - return { ok: false, reason: "ZIP too small to contain a central directory" }; + return { + ok: false, + reason: "ZIP too small to contain a central directory", + }; } const eocdOffset = findEocdOffset(buffer); diff --git a/packages/file-upload/src/file-extraction.module.ts b/packages/file-upload/src/file-extraction.module.ts index bc5bb5e..a6aa411 100644 --- a/packages/file-upload/src/file-extraction.module.ts +++ b/packages/file-upload/src/file-extraction.module.ts @@ -30,10 +30,7 @@ const DEFAULT_EXTRACTORS = [PDFExtractor, DOCXExtractor, PlainTextExtractor]; @Module({ imports: [ServiceLocatorModule], - providers: [ - TextExtractorRegistry, - ...DEFAULT_EXTRACTORS, - ], + providers: [TextExtractorRegistry, ...DEFAULT_EXTRACTORS], exports: [TextExtractorRegistry], }) export class FileExtractionModule { diff --git a/packages/file-upload/src/text-extractor.tag.ts b/packages/file-upload/src/text-extractor.tag.ts index 78d303d..55461ae 100644 --- a/packages/file-upload/src/text-extractor.tag.ts +++ b/packages/file-upload/src/text-extractor.tag.ts @@ -12,10 +12,9 @@ import type { TextExtractor } from "./types"; * directly. Keeping metadata empty avoids drift between the tag and * the class's own contract. */ -export const TextExtractorTag = defineTag< - Record, - TextExtractor ->("text-extractor"); +export const TextExtractorTag = defineTag, TextExtractor>( + "text-extractor", +); /** * Decorator that marks a class as a `TextExtractor` and makes it diff --git a/packages/file-upload/src/validators.ts b/packages/file-upload/src/validators.ts index 00852f0..2853a3f 100644 --- a/packages/file-upload/src/validators.ts +++ b/packages/file-upload/src/validators.ts @@ -1,9 +1,10 @@ import { FileUploadInput, + FileUploadSchema, FileValidationResult, SupportedMimeType, + SupportedMimeTypes, } from "./types"; -import { FileUploadSchema, SupportedMimeTypes } from "./types"; const MAX_FILE_SIZE = 10 * 1024 * 1024; // 10MB diff --git a/packages/handlers/src/handlers.module.ts b/packages/handlers/src/handlers.module.ts index 8a68e77..a89dda2 100644 --- a/packages/handlers/src/handlers.module.ts +++ b/packages/handlers/src/handlers.module.ts @@ -1,9 +1,6 @@ -import { DynamicModule, Module } from "@nestjs/common"; +import { DynamicModule, Module } from "@nestjs/common"; import { HtmlToPdfService } from "./pdf/html-to-pdf.service"; -import { - PDF_SERVICE_CONFIG, - PdfServiceConfig, -} from "./pdf/pdf-service.config"; +import { PDF_SERVICE_CONFIG, PdfServiceConfig } from "./pdf/pdf-service.config"; import { RenderPdfHandler } from "./render-pdf.handler"; export { PDF_SERVICE_CONFIG }; diff --git a/packages/mail/src/mail.module.ts b/packages/mail/src/mail.module.ts index 18ed6cf..e82e314 100644 --- a/packages/mail/src/mail.module.ts +++ b/packages/mail/src/mail.module.ts @@ -1,5 +1,5 @@ -import { DynamicModule, Module } from "@nestjs/common"; -import { MAIL_SERVICE_TOKEN, MailService } from "./mail.service.interface"; +import { DynamicModule, Module } from "@nestjs/common"; +import { MAIL_SERVICE_TOKEN, MailService } from "./mail.service.interface"; export interface MailModuleOptions { provider: new (...args: unknown[]) => MailService; diff --git a/packages/mail/src/resend/resend.module.ts b/packages/mail/src/resend/resend.module.ts index 628a1a8..a5015da 100644 --- a/packages/mail/src/resend/resend.module.ts +++ b/packages/mail/src/resend/resend.module.ts @@ -1,7 +1,6 @@ import { Global, Logger, Module } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; -import { - MAIL_SERVICE_TOKEN, MailService, } from "../mail.service.interface"; +import { MAIL_SERVICE_TOKEN, MailService } from "../mail.service.interface"; import { ConsoleMailService } from "../providers/console-mail.service"; import { ResendMailService } from "./resend-mail.service";