diff --git a/apps/api/src/config/cors.configuration.ts b/apps/api/src/config/cors.configuration.ts index 740cf89..6894659 100644 --- a/apps/api/src/config/cors.configuration.ts +++ b/apps/api/src/config/cors.configuration.ts @@ -1,4 +1,4 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { CorsConfigService } from "./cors.config"; export const configureCors = (app: INestApplication): void => { @@ -7,7 +7,10 @@ export const configureCors = (app: INestApplication): void => { const isDevelopment = corsConfig.isDevelopment(); app.enableCors({ - origin: (origin: string | undefined, callback: (err: Error | null, allow?: boolean) => void) => { + origin: ( + origin: string | undefined, + callback: (err: Error | null, allow?: boolean) => void, + ) => { if (!origin) { return callback(null, true); } diff --git a/apps/api/src/config/csrf.middleware.ts b/apps/api/src/config/csrf.middleware.ts index 67782f3..b0c12a2 100644 --- a/apps/api/src/config/csrf.middleware.ts +++ b/apps/api/src/config/csrf.middleware.ts @@ -1,5 +1,5 @@ -import type { NextFunction, Request, Response } from "express"; -import type { CorsConfigService } from "./cors.config"; +import { NextFunction, Request, Response } from "express"; +import { CorsConfigService } from "./cors.config"; const SAFE_METHODS = new Set(["GET", "HEAD", "OPTIONS"]); @@ -57,7 +57,8 @@ export const createCsrfMiddleware = (corsConfig: CorsConfigService) => { } res.status(403).json({ error: "Forbidden", - message: "Origin or Referer header required for state-changing requests", + message: + "Origin or Referer header required for state-changing requests", }); return; } diff --git a/apps/api/src/config/env.validation.ts b/apps/api/src/config/env.validation.ts index 2c955fd..c3b274d 100644 --- a/apps/api/src/config/env.validation.ts +++ b/apps/api/src/config/env.validation.ts @@ -126,7 +126,12 @@ export const envSchema = z } if (data.FILE_STORAGE_DRIVER === "r2") { - for (const key of ["R2_ENDPOINT", "R2_ACCESS_KEY_ID", "R2_SECRET_ACCESS_KEY", "R2_BUCKET"] as const) { + for (const key of [ + "R2_ENDPOINT", + "R2_ACCESS_KEY_ID", + "R2_SECRET_ACCESS_KEY", + "R2_BUCKET", + ] as const) { if (!data[key]) { ctx.addIssue({ code: z.ZodIssueCode.custom, diff --git a/apps/api/src/config/exception-to-http.pipe.ts b/apps/api/src/config/exception-to-http.pipe.ts index af709ef..0dfb355 100644 --- a/apps/api/src/config/exception-to-http.pipe.ts +++ b/apps/api/src/config/exception-to-http.pipe.ts @@ -4,15 +4,7 @@ import { EntityNotFoundError, } from "@cv/core"; import { - 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 a4b2b6c..956114c 100644 --- a/apps/api/src/config/file-storage.config.ts +++ b/apps/api/src/config/file-storage.config.ts @@ -1,10 +1,7 @@ +import { FileStorageConfigProvider, FileStorageModuleConfig } from "@cv/file-storage"; import { Injectable } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; -import type { - FileStorageConfigProvider, - FileStorageModuleConfig, -} from "@cv/file-storage"; -import type { Env } from "./env.validation"; +import { Env } from "./env.validation"; @Injectable() export class FileStorageConfig implements FileStorageConfigProvider { diff --git a/apps/api/src/config/graphql-complexity.plugin.ts b/apps/api/src/config/graphql-complexity.plugin.ts index 0df00e5..b07acd5 100644 --- a/apps/api/src/config/graphql-complexity.plugin.ts +++ b/apps/api/src/config/graphql-complexity.plugin.ts @@ -1,11 +1,11 @@ +import { ApolloServerPlugin, GraphQLRequestListener } from "@apollo/server"; import { Plugin } from "@nestjs/apollo"; -import type { ApolloServerPlugin, GraphQLRequestListener } from "@apollo/server"; +import { GraphQLError } from "graphql"; import { fieldExtensionsEstimator, getComplexity, simpleEstimator, } from "graphql-query-complexity"; -import { GraphQLError } from "graphql"; const MAX_COMPLEXITY = 1000; const DEFAULT_FIELD_COMPLEXITY = 1; @@ -23,7 +23,9 @@ const DEFAULT_FIELD_COMPLEXITY = 1; */ @Plugin() export class GraphQLComplexityPlugin implements ApolloServerPlugin { - async requestDidStart(): Promise> { + async requestDidStart(): Promise< + GraphQLRequestListener<{ request: unknown }> + > { return { async didResolveOperation({ request, document, schema }) { const complexity = getComplexity({ diff --git a/apps/api/src/config/helmet.configuration.ts b/apps/api/src/config/helmet.configuration.ts index 1fd132a..437f4c5 100644 --- a/apps/api/src/config/helmet.configuration.ts +++ b/apps/api/src/config/helmet.configuration.ts @@ -1,5 +1,5 @@ -import type { ConfigService } from "@nestjs/config"; -import type { HelmetOptions } from "helmet"; +import { ConfigService } from "@nestjs/config"; +import { HelmetOptions } from "helmet"; /** * Helmet config tuned for the cv-generator API. @@ -45,7 +45,10 @@ export const configureHelmet = (config: ConfigService): HelmetOptions => { ], fontSrc: ["'self'", "https://fonts.gstatic.com", "data:"], imgSrc: ["'self'", "data:", "blob:", "https:"], - connectSrc: ["'self'", "https://apollo-server-landing-page.cdn.apollographql.com"], + connectSrc: [ + "'self'", + "https://apollo-server-landing-page.cdn.apollographql.com", + ], // CV preview iframe uses srcDoc, not src; frameSrc 'self' covers any // future same-origin embed. frameSrc: ["'self'"], diff --git a/apps/api/src/main.ts b/apps/api/src/main.ts index b641876..b942572 100644 --- a/apps/api/src/main.ts +++ b/apps/api/src/main.ts @@ -8,8 +8,8 @@ import { ZodValidationPipe } from "nestjs-zod"; import { CorsConfigService } from "./config/cors.config"; import { configureCors } from "./config/cors.configuration"; import { createCsrfMiddleware } from "./config/csrf.middleware"; -import { configureHelmet } from "./config/helmet.configuration"; import { DomainExceptionFilter } from "./config/exception-to-http.pipe"; +import { configureHelmet } from "./config/helmet.configuration"; import { AppModule } from "./modules/app.module"; import { GraphQLExceptionFilter } from "./modules/base/graphql-exception.filter"; diff --git a/apps/api/src/modules/admin/admin.module.ts b/apps/api/src/modules/admin/admin.module.ts index 5eef4b6..495577c 100644 --- a/apps/api/src/modules/admin/admin.module.ts +++ b/apps/api/src/modules/admin/admin.module.ts @@ -2,6 +2,7 @@ import { AIModule } from "@cv/ai-provider"; import { BaseModule } from "@cv/core"; import { Module } from "@nestjs/common"; import { ApplicationStatusModule } from "@/modules/application/application-status/application-status.module"; +import { DatabaseModule } from "@/modules/database/database.module"; import { EducationModule } from "@/modules/education/education.module"; import { CompanyModule } from "@/modules/job-experience/company/company.module"; import { LevelModule } from "@/modules/job-experience/level/level.module"; @@ -9,7 +10,6 @@ import { RoleModule } from "@/modules/job-experience/role/role.module"; import { SkillModule } from "@/modules/job-experience/skill/skill.module"; import { OrganizationModule } from "@/modules/organization/organization.module"; import { JobTypeModule } from "@/modules/vacancies/job-type/job-type.module"; -import { DatabaseModule } from "@/modules/database/database.module"; import { AdminResolver } from "./admin.resolver"; import { AdminLookupResolver } from "./graphql/admin-lookup.resolver"; import { QueueMonitorService } from "./queue-monitor.service"; diff --git a/apps/api/src/modules/admin/admin.resolver.ts b/apps/api/src/modules/admin/admin.resolver.ts index 939d70a..b7055f4 100644 --- a/apps/api/src/modules/admin/admin.resolver.ts +++ b/apps/api/src/modules/admin/admin.resolver.ts @@ -1,11 +1,8 @@ import { - AI_PROVIDER, - type AIProvider, - registeredProviderTypes, -} from "@cv/ai-provider"; + AI_PROVIDER, AIProvider, registeredProviderTypes, } from "@cv/ai-provider"; import { AdminGuard, JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { Inject, Optional, UseGuards } from "@nestjs/common"; import { PageInfo } from "@cv/core"; +import { Inject, Optional, UseGuards } from "@nestjs/common"; import { Args, Int, Query, Resolver } from "@nestjs/graphql"; import { AiCallLogEntryType, @@ -114,7 +111,9 @@ export class AdminResolver { async queueMessages( @Args("limit", { type: () => Int, nullable: true }) limit?: number, ): Promise> { - const result = await this.queueMonitorService.getMessages(limit ?? undefined); + const result = await this.queueMonitorService.getMessages( + limit ?? undefined, + ); return QueueMessageConnection.fromPaginationResult({ edges: result.map((r, i) => ({ node: r, cursor: String(i) })), pageInfo: new PageInfo(false, false, null, null), diff --git a/apps/api/src/modules/admin/admin.type.ts b/apps/api/src/modules/admin/admin.type.ts index d6e8752..6d93dbf 100644 --- a/apps/api/src/modules/admin/admin.type.ts +++ b/apps/api/src/modules/admin/admin.type.ts @@ -1,6 +1,6 @@ import { Field, Float, ID, Int, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; -import type { +import { QueueMessageResult, QueueStatsResult, WorkerHealthResult, @@ -73,15 +73,15 @@ export class QueueMessage { } } -export const { - Connection: QueueMessageConnection, - Edge: QueueMessageEdge, -} = createConnection( - QueueMessage, - QueueMessage.fromDomain, -); +export const { Connection: QueueMessageConnection, Edge: QueueMessageEdge } = + createConnection( + QueueMessage, + QueueMessage.fromDomain, + ); -export type QueueMessageConnection = InstanceType; +export type QueueMessageConnection = InstanceType< + typeof QueueMessageConnection +>; export type QueueMessageEdge = InstanceType; @ObjectType() diff --git a/apps/api/src/modules/admin/ai-call-log-persistence.service.ts b/apps/api/src/modules/admin/ai-call-log-persistence.service.ts index 63672da..770f5dc 100644 --- a/apps/api/src/modules/admin/ai-call-log-persistence.service.ts +++ b/apps/api/src/modules/admin/ai-call-log-persistence.service.ts @@ -1,6 +1,6 @@ import { Injectable, Logger } from "@nestjs/common"; import { PrismaService } from "@/modules/database/prisma.service"; -import type { AiCallLogEntry } from "./ai-call-log.service"; +import { AiCallLogEntry } from "./ai-call-log.service"; interface QueryOptions { limit?: number; diff --git a/apps/api/src/modules/admin/ai-call-log.module.ts b/apps/api/src/modules/admin/ai-call-log.module.ts index cb4e894..04e377a 100644 --- a/apps/api/src/modules/admin/ai-call-log.module.ts +++ b/apps/api/src/modules/admin/ai-call-log.module.ts @@ -1,7 +1,7 @@ import { Global, Module } from "@nestjs/common"; import { DatabaseModule } from "@/modules/database/database.module"; -import { AiCallLogPersistenceService } from "./ai-call-log-persistence.service"; import { AiCallLogService } from "./ai-call-log.service"; +import { AiCallLogPersistenceService } from "./ai-call-log-persistence.service"; @Global() @Module({ 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 df4f64b..5680028 100644 --- a/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts +++ b/apps/api/src/modules/admin/graphql/admin-lookup.resolver.ts @@ -1,26 +1,9 @@ import { AdminGuard, JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import type { NamedEntity } from "@cv/core"; -import { ClockService, UuidFactoryService } from "@cv/core"; +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"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; -import { ApplicationStatusService } from "@cv/core"; -import { ApplicationStatus } from "@cv/core"; -import { SkillService } from "@cv/core"; -import { Skill } from "@cv/core"; -import { CompanyService } from "@cv/core"; -import { Company } from "@cv/core"; -import { RoleService } from "@cv/core"; -import { Role } from "@cv/core"; -import { LevelService } from "@cv/core"; -import { Level } from "@cv/core"; -import { InstitutionService } from "@cv/core"; -import { Institution } from "@cv/core"; -import { JobTypeService } from "@cv/core"; -import { JobType } from "@cv/core"; -import { OrganizationService } from "@cv/core"; -import { Organization } from "@cv/core"; -import { OrganizationRoleService } from "@cv/core"; -import { OrganizationRole } from "@cv/core"; import { AdminEntityType, AdminLookupEntity } from "./admin-lookup.type"; type EntityLike = { @@ -97,13 +80,15 @@ export class AdminLookupResolver { ), [AdminEntityType.ORGANIZATION]: { findMany: (searchTerm) => - organizationService.findMany().then((orgs) => - searchTerm - ? orgs.filter((o) => - o.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - : orgs, - ), + organizationService + .findMany() + .then((orgs) => + searchTerm + ? orgs.filter((o) => + o.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + : orgs, + ), findByIdOrFail: (id) => organizationService.findByIdOrFail(id), save: (entity) => organizationService.save(entity as unknown as Organization), @@ -114,13 +99,15 @@ export class AdminLookupResolver { }, [AdminEntityType.ORGANIZATION_ROLE]: { findMany: (searchTerm) => - organizationRoleService.findAll().then((roles) => - searchTerm - ? roles.filter((r) => - r.name.toLowerCase().includes(searchTerm.toLowerCase()), - ) - : roles, - ), + organizationRoleService + .findAll() + .then((roles) => + searchTerm + ? roles.filter((r) => + r.name.toLowerCase().includes(searchTerm.toLowerCase()), + ) + : roles, + ), findByIdOrFail: (id) => organizationRoleService.findByIdOrFail(id), save: async (entity) => { const desc = @@ -163,12 +150,7 @@ export class AdminLookupResolver { ): Promise { const adapter = this.registry[entityType]; const now = this.clock.now(); - const entity = adapter.create( - this.uuid.generate(), - name, - now, - description, - ); + const entity = adapter.create(this.uuid.generate(), name, now, description); const saved = await adapter.save(entity); return AdminLookupEntity.fromDomain(saved); } diff --git a/apps/api/src/modules/admin/logging-ai-provider.ts b/apps/api/src/modules/admin/logging-ai-provider.ts index b204911..7ecf837 100644 --- a/apps/api/src/modules/admin/logging-ai-provider.ts +++ b/apps/api/src/modules/admin/logging-ai-provider.ts @@ -1,10 +1,5 @@ import { randomUUID } from "node:crypto"; -import type { - AICompletionRequest, - AICompletionResponse, - AIProvider, - AIProviderStatus, -} from "@cv/ai-provider"; +import { AICompletionRequest, AICompletionResponse, AIProvider, AIProviderStatus } from "@cv/ai-provider"; import { AiCallLogService } from "./ai-call-log.service"; interface LoggingOptions { diff --git a/apps/api/src/modules/admin/queue-monitor.service.ts b/apps/api/src/modules/admin/queue-monitor.service.ts index 2ac1e50..16abacb 100644 --- a/apps/api/src/modules/admin/queue-monitor.service.ts +++ b/apps/api/src/modules/admin/queue-monitor.service.ts @@ -48,9 +48,7 @@ export interface WorkerHealthResult { const HEALTHY_THRESHOLD_SECONDS = 60; const STALE_THRESHOLD_SECONDS = 300; -const deriveWorkerStatus = ( - lastSeenAt: Date, -): "healthy" | "stale" | "dead" => { +const deriveWorkerStatus = (lastSeenAt: Date): "healthy" | "stale" | "dead" => { const ageSeconds = (Date.now() - lastSeenAt.getTime()) / 1000; if (ageSeconds <= HEALTHY_THRESHOLD_SECONDS) return "healthy"; if (ageSeconds <= STALE_THRESHOLD_SECONDS) return "stale"; diff --git a/apps/api/src/modules/app.module.ts b/apps/api/src/modules/app.module.ts index 87fd49f..a38dc6d 100644 --- a/apps/api/src/modules/app.module.ts +++ b/apps/api/src/modules/app.module.ts @@ -1,7 +1,12 @@ -import { AuthorizationModule, EventsModule, UserModule } from "@cv/core"; import { AuthModule } from "@cv/auth"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + EventsModule, + UserModule, +} from "@cv/core"; import { FileStorageModule } from "@cv/file-storage"; -import { BaseModule, DatabaseModule } from "@cv/core"; import { ApolloDriver, type ApolloDriverConfig } from "@nestjs/apollo"; import { Module } from "@nestjs/common"; import { ConfigModule, ConfigService } from "@nestjs/config"; @@ -9,7 +14,7 @@ import { APP_GUARD } from "@nestjs/core"; import { GraphQLModule } from "@nestjs/graphql"; import { JwtModule } from "@nestjs/jwt"; import { ThrottlerGuard, ThrottlerModule } from "@nestjs/throttler"; -import type { Request, Response } from "express"; +import { Request, Response } from "express"; import { AppConfigModule } from "@/config/config.module"; import { validate } from "@/config/env.validation"; import { FileStorageConfig } from "@/config/file-storage.config"; @@ -17,8 +22,8 @@ import { GraphQLComplexityPlugin } from "@/config/graphql-complexity.plugin"; import { AdminModule } from "./admin/admin.module"; import { AiCallLogModule } from "./admin/ai-call-log.module"; import { AppModule as AppModuleComponent } from "./app/app.module"; -import { ApplicationStatusModule } from "./application/application-status/application-status.module"; import { ApplicationModule } from "./application/application.module"; +import { ApplicationStatusModule } from "./application/application-status/application-status.module"; import { AuthenticationModule } from "./authentication/authentication.module"; import { CurrentUserModule } from "./current-user/current-user.module"; import { CVParserModule } from "./cv-parser/cv-parser.module"; @@ -31,11 +36,11 @@ import { EmploymentModule } from "./job-experience/employment/employment.module" import { LevelModule } from "./job-experience/level/level.module"; import { RoleModule } from "./job-experience/role/role.module"; import { SkillModule } from "./job-experience/skill/skill.module"; +import { ProjectQMessengerModule } from "./messenger/messenger.module"; import { OnboardingModule } from "./onboarding/onboarding.module"; import { OrganizationModule } from "./organization/organization.module"; import { ProfileModule } from "./profile/profile.module"; import { UserAiSettingsModule } from "./user-settings/user-ai-settings.module"; -import { ProjectQMessengerModule } from "./messenger/messenger.module"; import { JobTypeModule } from "./vacancies/job-type/job-type.module"; import { VacancyModule } from "./vacancies/vacancy.module"; diff --git a/apps/api/src/modules/application/application-status.dataloader.ts b/apps/api/src/modules/application/application-status.dataloader.ts index d01cbef..c5294e5 100644 --- a/apps/api/src/modules/application/application-status.dataloader.ts +++ b/apps/api/src/modules/application/application-status.dataloader.ts @@ -1,7 +1,6 @@ -import { PrismaService } from "@cv/core"; +import { ApplicationStatusRelation, PrismaService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; import DataLoader from "dataloader"; -import type { ApplicationStatusRelation } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) export class ApplicationStatusDataLoaderService { diff --git a/apps/api/src/modules/application/application-status/application-status.module.ts b/apps/api/src/modules/application/application-status/application-status.module.ts index 88191f1..177444d 100644 --- a/apps/api/src/modules/application/application-status/application-status.module.ts +++ b/apps/api/src/modules/application/application-status/application-status.module.ts @@ -1,8 +1,11 @@ -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + ApplicationStatusFactory, + ApplicationStatusMapper, + ApplicationStatusService, + BaseModule, + DatabaseModule, +} from "@cv/core"; import { Module } from "@nestjs/common"; -import { ApplicationStatusFactory } from "@cv/core"; -import { ApplicationStatusMapper } from "@cv/core"; -import { ApplicationStatusService } from "@cv/core"; @Module({ imports: [DatabaseModule, BaseModule], diff --git a/apps/api/src/modules/application/application.module.ts b/apps/api/src/modules/application/application.module.ts index 46a8d3b..278f10f 100644 --- a/apps/api/src/modules/application/application.module.ts +++ b/apps/api/src/modules/application/application.module.ts @@ -1,13 +1,15 @@ -import { AuthorizationModule } from "@cv/core"; import { AuthModule } from "@cv/auth"; -import { DatabaseModule } from "@cv/core"; +import { + ApplicationMapper, + ApplicationPolicy, + ApplicationService, + AuthorizationModule, + DatabaseModule, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { CVTemplateModule } from "@/modules/cv-template/cv-template.module"; import { VacancyModule } from "@/modules/vacancies/vacancy.module"; -import { ApplicationMapper } from "@cv/core"; -import { ApplicationPolicy } from "@cv/core"; -import { ApplicationService } from "@cv/core"; import { ApplicationStatusDataLoaderService } from "./application-status.dataloader"; import { ApplicationResolver } from "./graphql/application.resolver"; import { ApplicationUserFieldResolver } from "./graphql/user-field.resolver"; diff --git a/apps/api/src/modules/application/graphql/application.resolver.ts b/apps/api/src/modules/application/graphql/application.resolver.ts index fbb9b21..fbee90c 100644 --- a/apps/api/src/modules/application/graphql/application.resolver.ts +++ b/apps/api/src/modules/application/graphql/application.resolver.ts @@ -1,7 +1,7 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PrismaService } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; +import { + Application as ApplicationEntity, ApplicationMapper, ApplicationService, AuthorizationService, PrismaService, } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, @@ -16,9 +16,6 @@ import { CVDataLoaderService } from "@/modules/cv-template/cv.dataloader"; import { CV } from "@/modules/cv-template/graphql/cv.type"; import { Vacancy } from "@/modules/vacancies/graphql/vacancy.type"; import { VacancyDataLoaderService } from "@/modules/vacancies/vacancy.dataloader"; -import { Application as ApplicationEntity } from "@cv/core"; -import { ApplicationMapper } from "@cv/core"; -import { ApplicationService } from "@cv/core"; import { ApplicationStatusDataLoaderService } from "../application-status.dataloader"; import { CreateApplicationInput, diff --git a/apps/api/src/modules/application/graphql/application.type.ts b/apps/api/src/modules/application/graphql/application.type.ts index eda3ddd..19df7c7 100644 --- a/apps/api/src/modules/application/graphql/application.type.ts +++ b/apps/api/src/modules/application/graphql/application.type.ts @@ -1,7 +1,7 @@ +import { Application as ApplicationEntity } from "@cv/core"; import { Field, ID, ObjectType } from "@nestjs/graphql"; import { GraphQLDate } from "graphql-scalars"; import { createConnection } from "@/modules/base/connection.factory"; -import { Application as ApplicationEntity } from "@cv/core"; @ObjectType() export class ApplicationStatus { 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 11a13cb..126b775 100644 --- a/apps/api/src/modules/application/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/application/graphql/user-field.resolver.ts @@ -1,9 +1,8 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { 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"; -import { ApplicationService } from "@cv/core"; import { ApplicationConnection } from "./application.type"; @Resolver(() => User) diff --git a/apps/api/src/modules/authentication/authentication.module.ts b/apps/api/src/modules/authentication/authentication.module.ts index 5aca6fd..f7d0b97 100644 --- a/apps/api/src/modules/authentication/authentication.module.ts +++ b/apps/api/src/modules/authentication/authentication.module.ts @@ -1,8 +1,7 @@ import { AuthModule } from "@cv/auth"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { AuthenticationService, BaseModule, DatabaseModule } from "@cv/core"; import { Module } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { AuthenticationService } from "@cv/core"; import { PasswordProviderModule } from "./providers/password/password-provider.module"; import { AuthenticationController } from "./rest/authentication.controller"; import { TokenResolver } from "./token/token.resolver"; 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 b87889c..f029e95 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,12 +1,12 @@ -import { AuthCookieService, AuthorizationService, type User as DomainUser, PasswordAuthenticationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { RequestMetadata } from "@cv/core"; +import { + AuthCookieService, AuthorizationService, 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"; import { User } from "@/modules/user/user.type"; import { AuthenticationResponse } from "../../../graphql/authentication.type"; -import type { GraphQLContext } from "../../../graphql/graphql-context.type"; +import { GraphQLContext } from "../../../graphql/graphql-context.type"; @Resolver() 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 2c4bab0..204badc 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 @@ -12,10 +12,7 @@ import { ConfigModule, ConfigService } from "@nestjs/config"; import { PasswordAuthenticationResolver } from "./graphql/password-authentication.resolver"; @Module({ - imports: [ - ConfigModule, - AuthPasswordProviderModule, - ], + imports: [ConfigModule, AuthPasswordProviderModule], providers: [ PasswordAuthenticationResolver, { diff --git a/apps/api/src/modules/authentication/rest/authentication.controller.ts b/apps/api/src/modules/authentication/rest/authentication.controller.ts index 94d53f4..a8fe9a5 100644 --- a/apps/api/src/modules/authentication/rest/authentication.controller.ts +++ b/apps/api/src/modules/authentication/rest/authentication.controller.ts @@ -1,8 +1,7 @@ -import { AuthCookieService } from "@cv/core"; -import { RequestMetadata } from "@cv/core"; +import { + AuthCookieService, AuthenticationService, RequestMetadata, } from "@cv/core"; import { Controller, Post, Res } from "@nestjs/common"; import type { Response } from "express"; -import { AuthenticationService } from "@cv/core"; import { RefreshTokenCookie } from "../token/refresh-token-cookie.decorator"; import { RefreshTokenResponseDto } from "../token/refresh-token-response.dto"; import { TokenExpiration } from "../token/token-expiration.type"; diff --git a/apps/api/src/modules/authentication/token/refresh-token-cookie.decorator.ts b/apps/api/src/modules/authentication/token/refresh-token-cookie.decorator.ts index 09876bc..1712f05 100644 --- a/apps/api/src/modules/authentication/token/refresh-token-cookie.decorator.ts +++ b/apps/api/src/modules/authentication/token/refresh-token-cookie.decorator.ts @@ -1,5 +1,5 @@ import { createGqlParamDecorator, unauthorized } from "@cv/core"; -import type { ExecutionContext } from "@nestjs/common"; +import { ExecutionContext } from "@nestjs/common"; import { GqlExecutionContext } from "@nestjs/graphql"; import { z } from "zod/v4"; diff --git a/apps/api/src/modules/authentication/token/token.resolver.ts b/apps/api/src/modules/authentication/token/token.resolver.ts index d560436..b0b5b3f 100644 --- a/apps/api/src/modules/authentication/token/token.resolver.ts +++ b/apps/api/src/modules/authentication/token/token.resolver.ts @@ -1,11 +1,11 @@ -import { AuthCookieService, AuthorizationService, type User as DomainUser, RefreshToken, RefreshTokenService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +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"; import { CurrentRefreshTokenId } from "@/modules/current-user/current-refresh-token-id.decorator"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; -import type { GraphQLContext } from "../graphql/graphql-context.type"; +import { GraphQLContext } from "../graphql/graphql-context.type"; import { ActiveSession } from "./active-session.type"; @Resolver() diff --git a/apps/api/src/modules/base/connection.factory.ts b/apps/api/src/modules/base/connection.factory.ts index 79a101c..c7cd3c9 100644 --- a/apps/api/src/modules/base/connection.factory.ts +++ b/apps/api/src/modules/base/connection.factory.ts @@ -1,6 +1,6 @@ -import { PageInfo, type PaginationResult } from "@cv/core"; +import { PageInfo, PaginationResult } from "@cv/core"; import { raise } from "@cv/utils"; -import type { Type } from "@nestjs/common"; +import { Type } from "@nestjs/common"; import { Field, Int, ObjectType } from "@nestjs/graphql"; export function createConnection( diff --git a/apps/api/src/modules/base/graphql-exception.filter.ts b/apps/api/src/modules/base/graphql-exception.filter.ts index 89c8146..7a63b78 100644 --- a/apps/api/src/modules/base/graphql-exception.filter.ts +++ b/apps/api/src/modules/base/graphql-exception.filter.ts @@ -1,11 +1,11 @@ import { AuthenticationError, AuthorizationError, + DomainError, EntityNotFoundError, } from "@cv/core"; -import { DomainError } from "@cv/core"; import { - ArgumentsHost, + type ArgumentsHost, Catch, ConflictException, ForbiddenException, diff --git a/apps/api/src/modules/base/named-graphql-type.factory.ts b/apps/api/src/modules/base/named-graphql-type.factory.ts index 782fe5d..27d2ee2 100644 --- a/apps/api/src/modules/base/named-graphql-type.factory.ts +++ b/apps/api/src/modules/base/named-graphql-type.factory.ts @@ -1,5 +1,5 @@ -import type { NamedEntity } from "@cv/core"; -import type { Type } from "@nestjs/common"; +import { NamedEntity } from "@cv/core"; +import { Type } from "@nestjs/common"; import { Field, ObjectType } from "@nestjs/graphql"; import { BaseGraphQLType } from "./base-graphql-type"; import { createConnection } from "./connection.factory"; diff --git a/apps/api/src/modules/current-user/me.resolver.ts b/apps/api/src/modules/current-user/me.resolver.ts index bbc4c8e..8adaabe 100644 --- a/apps/api/src/modules/current-user/me.resolver.ts +++ b/apps/api/src/modules/current-user/me.resolver.ts @@ -1,6 +1,5 @@ -import type { User as DomainUser } from "@cv/core"; -import { UserService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser, UserService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Query, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; 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 0779251..1507842 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,10 +1,10 @@ import { readFileSync } from "node:fs"; import { join } from "node:path"; import { User } from "@cv/core"; -import type { Mocked } from "vitest"; -import type { AIProviderResolverService } from "../ai-provider-resolver.service"; +import { Mocked } from "vitest"; +import { AIProviderResolverService } from "../ai-provider-resolver.service"; import { CVParserService } from "../cv-parser.service"; -import type { EntityResolverService } from "../entity-resolver.service"; +import { EntityResolverService } from "../entity-resolver.service"; import { mockJaneDoeParsedCV, mockJohnSmithParsedCV, 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 86430f3..8d30d02 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,4 +1,4 @@ -import type { Mock } from "vitest"; +import { Mock } from "vitest"; import { EntityResolverService } from "../entity-resolver.service"; type MockPrisma = { diff --git a/apps/api/src/modules/cv-parser/__tests__/fixtures/mock-ai-responses.ts b/apps/api/src/modules/cv-parser/__tests__/fixtures/mock-ai-responses.ts index 80f7ba3..9ceea50 100644 --- a/apps/api/src/modules/cv-parser/__tests__/fixtures/mock-ai-responses.ts +++ b/apps/api/src/modules/cv-parser/__tests__/fixtures/mock-ai-responses.ts @@ -1,4 +1,4 @@ -import type { ParsedCVData } from "@cv/ai-parser"; +import { ParsedCVData } from "@cv/ai-parser"; /** * Mock AI response for the plain text CV (John Smith) 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 e00c769..afcd77b 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,11 +1,7 @@ import { randomUUID } from "node:crypto"; import { - AI_PROVIDER, - type AIProvider, - AnthropicProvider, - OpenAIProvider, -} from "@cv/ai-provider"; -import type { User } from "@cv/core"; + AI_PROVIDER, AIProvider, AnthropicProvider, OpenAIProvider, } from "@cv/ai-provider"; +import { User } from "@cv/core"; import { BadRequestException, ForbiddenException, 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 f93506a..fc4121e 100644 --- a/apps/api/src/modules/cv-parser/cv-parser.module.ts +++ b/apps/api/src/modules/cv-parser/cv-parser.module.ts @@ -3,8 +3,8 @@ import { mkdirSync } from "node:fs"; import { join } from "node:path"; import { CVParserModule as CVParserCoreModule } from "@cv/ai-parser"; import { AIModule } from "@cv/ai-provider"; -import { FileExtractionModule } from "@cv/file-upload"; import { DatabaseModule } from "@cv/core"; +import { FileExtractionModule } from "@cv/file-upload"; import { Module } from "@nestjs/common"; import { MulterModule } from "@nestjs/platform-express"; import { diskStorage } from "multer"; diff --git a/apps/api/src/modules/cv-parser/cv-parser.resolver.ts b/apps/api/src/modules/cv-parser/cv-parser.resolver.ts index cc3c975..2825d4e 100644 --- a/apps/api/src/modules/cv-parser/cv-parser.resolver.ts +++ b/apps/api/src/modules/cv-parser/cv-parser.resolver.ts @@ -1,5 +1,5 @@ -import type { User as DomainUser } from "@cv/core"; import { JwtAuthGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Mutation, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "../current-user/current-user.decorator"; 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 c5ee4f7..c43c338 100644 --- a/apps/api/src/modules/cv-parser/cv-parser.service.ts +++ b/apps/api/src/modules/cv-parser/cv-parser.service.ts @@ -1,17 +1,10 @@ -import { CVParserService as CVParser, type ParsedCVData } from "@cv/ai-parser"; -import type { User } from "@cv/core"; +import { CVParserService as CVParser, ParsedCVData } from "@cv/ai-parser"; +import { User } from "@cv/core"; import { - TEXT_EXTRACTOR_REGISTRY, - type 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, - type ResolvedEducation, - type 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-parser/file-upload.controller.ts b/apps/api/src/modules/cv-parser/file-upload.controller.ts index 8ceff7f..39175b7 100644 --- a/apps/api/src/modules/cv-parser/file-upload.controller.ts +++ b/apps/api/src/modules/cv-parser/file-upload.controller.ts @@ -1,7 +1,7 @@ import { createHash } from "node:crypto"; import { readFile, unlink } from "node:fs/promises"; -import type { User as DomainUser } from "@cv/core"; import { JwtAuthGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; import { validateFile } from "@cv/file-upload"; import { BadRequestException, @@ -15,8 +15,8 @@ import { UseInterceptors, } from "@nestjs/common"; import { FileInterceptor } from "@nestjs/platform-express"; -import { FileImportSource } from "@/modules/data-import/sources/file-import-source"; import { ImportService } from "@/modules/data-import/import.service"; +import { FileImportSource } from "@/modules/data-import/sources/file-import-source"; @Controller("api/cv-parser") export class FileUploadController { @@ -81,7 +81,10 @@ export class FileUploadController { sizeBytes: userFile.sizeBytes, }; } catch (error) { - this.logger.error(`File upload failed: ${error instanceof Error ? error.message : error}`, error instanceof Error ? error.stack : undefined); + this.logger.error( + `File upload failed: ${error instanceof Error ? error.message : error}`, + error instanceof Error ? error.stack : undefined, + ); const message = error instanceof Error ? error.message : "Failed to process file"; @@ -92,7 +95,9 @@ export class FileUploadController { try { await unlink(filePath); } catch (err) { - this.logger.warn(`Failed to clean up temporary file ${filePath}: ${err instanceof Error ? err.message : err}`); + this.logger.warn( + `Failed to clean up temporary file ${filePath}: ${err instanceof Error ? err.message : err}`, + ); } } } diff --git a/apps/api/src/modules/cv-parser/graphql/upload-file.input.ts b/apps/api/src/modules/cv-parser/graphql/upload-file.input.ts index 218b030..78f607a 100644 --- a/apps/api/src/modules/cv-parser/graphql/upload-file.input.ts +++ b/apps/api/src/modules/cv-parser/graphql/upload-file.input.ts @@ -2,7 +2,10 @@ import { Field, ID, InputType } from "@nestjs/graphql"; @InputType() export class UploadFileInput { - @Field(() => ID, { nullable: true, description: "Target profile. If omitted, auto-creates a Default profile." }) + @Field(() => ID, { + nullable: true, + description: "Target profile. If omitted, auto-creates a Default profile.", + }) profileId?: string; @Field() diff --git a/apps/api/src/modules/cv-parser/graphql/upload-file.resolver.ts b/apps/api/src/modules/cv-parser/graphql/upload-file.resolver.ts index bd3f625..a4b8752 100644 --- a/apps/api/src/modules/cv-parser/graphql/upload-file.resolver.ts +++ b/apps/api/src/modules/cv-parser/graphql/upload-file.resolver.ts @@ -1,6 +1,6 @@ import { createHash } from "node:crypto"; -import type { User as DomainUser } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser, ProfileService } from "@cv/core"; import { validateFile } from "@cv/file-upload"; import { BadRequestException, UseGuards } from "@nestjs/common"; import { Args, Mutation, Resolver } from "@nestjs/graphql"; @@ -8,7 +8,6 @@ import { CurrentUser } from "@/modules/current-user/current-user.decorator"; import { UserFileType } from "@/modules/data-import/graphql/user-file.type"; import { ImportService } from "@/modules/data-import/import.service"; import { FileImportSource } from "@/modules/data-import/sources/file-import-source"; -import { ProfileService } from "@cv/core"; import { UploadFileInput } from "./upload-file.input"; const MAX_DECODED_SIZE = 10 * 1024 * 1024; // 10MB @@ -58,7 +57,10 @@ export class UploadFileResolver { } const profile = input.profileId - ? await this.profileService.findByIdAndUserOrFail(input.profileId, user.id) + ? await this.profileService.findByIdAndUserOrFail( + input.profileId, + user.id, + ) : await this.profileService.getOrCreateDefaultProfile(user.id); const userFile = await this.importService.createImport( diff --git a/apps/api/src/modules/cv-parser/onboarding/import.step.ts b/apps/api/src/modules/cv-parser/onboarding/import.step.ts index 1db3fdf..04d5e01 100644 --- a/apps/api/src/modules/cv-parser/onboarding/import.step.ts +++ b/apps/api/src/modules/cv-parser/onboarding/import.step.ts @@ -1,5 +1,4 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { OnboardingStep } from "@/modules/onboarding/onboarding-step.decorator"; import { diff --git a/apps/api/src/modules/cv-parser/types/draft.types.ts b/apps/api/src/modules/cv-parser/types/draft.types.ts index ac2d177..596695e 100644 --- a/apps/api/src/modules/cv-parser/types/draft.types.ts +++ b/apps/api/src/modules/cv-parser/types/draft.types.ts @@ -1,5 +1,5 @@ import { Field, ID, ObjectType } from "@nestjs/graphql"; -import type { +import { DraftEntity, ResolvedEducation, ResolvedJobExperience, diff --git a/apps/api/src/modules/cv-template/cv-template.module.ts b/apps/api/src/modules/cv-template/cv-template.module.ts index 3a913e1..86ce443 100644 --- a/apps/api/src/modules/cv-template/cv-template.module.ts +++ b/apps/api/src/modules/cv-template/cv-template.module.ts @@ -1,18 +1,21 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; -import { Module, forwardRef } from "@nestjs/common"; +import { + AuthorizationModule, + BaseModule, + CVDataAssemblerService, + CVPolicy, + CVRendererService, + CVService, + CVTemplatePolicy, + CVTemplateService, + DatabaseModule, + PdfDownloadController, +} from "@cv/core"; +import { forwardRef, Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { ProfileModule } from "@/modules/profile/profile.module"; -import { CVDataAssemblerService } from "@cv/core"; -import { CVRendererService } from "@cv/core"; import { CVDataLoaderService } from "./cv.dataloader"; -import { CVPolicy } from "@cv/core"; -import { CVService } from "@cv/core"; -import { CVTemplatePolicy } from "@cv/core"; -import { CVTemplateService } from "@cv/core"; import { CVResolver, CVTemplateResolver } from "./graphql/cv-template.resolver"; import { CVUserFieldResolver } from "./graphql/user-field.resolver"; -import { PdfDownloadController } from "@cv/core"; import { CVTemplateSeedService } from "./seed/cv-template.seed"; @Module({ diff --git a/apps/api/src/modules/cv-template/cv.dataloader.ts b/apps/api/src/modules/cv-template/cv.dataloader.ts index f7726f8..b3d21fd 100644 --- a/apps/api/src/modules/cv-template/cv.dataloader.ts +++ b/apps/api/src/modules/cv-template/cv.dataloader.ts @@ -1,6 +1,5 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { BaseDataLoaderService, CVService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { CVService } from "@cv/core"; import { CV } from "./graphql/cv.type"; @Injectable({ scope: Scope.REQUEST }) 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 4382347..1ea31f5 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,16 +1,11 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService, UuidFactoryService } from "@cv/core"; +import { AuthorizationService, 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 type { MessageBus } from "@riotbyte-com/project-q-core"; +import { MessageBus } from "@riotbyte-com/project-q-core"; import { InjectMessageBus } from "@riotbyte-com/project-q-nestjs"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; import { RenderPdfMessage } from "@/modules/messenger/messages/render-pdf.message"; -import { CVRendererService } from "@cv/core"; -import { CVService } from "@cv/core"; -import { CVTemplateService } from "@cv/core"; import { CV } from "./cv.type"; import { CreateCVInput, UpdateCVInput } from "./cv-input.type"; import { diff --git a/apps/api/src/modules/cv-template/graphql/user-field.resolver.ts b/apps/api/src/modules/cv-template/graphql/user-field.resolver.ts index 5f1a8a3..4619c01 100644 --- a/apps/api/src/modules/cv-template/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/cv-template/graphql/user-field.resolver.ts @@ -1,9 +1,8 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService, PrismaService } from "@cv/core"; +import { CVService, 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"; -import { CVService } from "@cv/core"; import { CVConnection } from "./cv.type"; import { CVArgs } from "./cv-args.type"; diff --git a/apps/api/src/modules/data-import/data-import-source.interface.ts b/apps/api/src/modules/data-import/data-import-source.interface.ts index 831a716..7a5c835 100644 --- a/apps/api/src/modules/data-import/data-import-source.interface.ts +++ b/apps/api/src/modules/data-import/data-import-source.interface.ts @@ -1,5 +1,5 @@ -import type { ParsedCVData } from "@cv/ai-parser"; -import type { User } from "@cv/core"; +import { ParsedCVData } from "@cv/ai-parser"; +import { User } from "@cv/core"; export interface DataImportSource { readonly name: string; diff --git a/apps/api/src/modules/data-import/data-import.module.ts b/apps/api/src/modules/data-import/data-import.module.ts index 2097d01..1f4f9bc 100644 --- a/apps/api/src/modules/data-import/data-import.module.ts +++ b/apps/api/src/modules/data-import/data-import.module.ts @@ -1,5 +1,4 @@ -import { AuthorizationModule } from "@cv/core"; -import { DatabaseModule } from "@cv/core"; +import { AuthorizationModule, DatabaseModule } from "@cv/core"; import { Module } from "@nestjs/common"; import { EntityResolverService } from "@/modules/cv-parser/entity-resolver.service"; import { ProfileModule } from "@/modules/profile/profile.module"; 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 b3ea596..6bf46e7 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,6 +1,6 @@ +import { User } from "@cv/core"; import { DomainEvent } from "@cv/core"; -import type { User } from "@cv/core"; -import type { DataImportSource } from "../data-import-source.interface"; +import { DataImportSource } from "../data-import-source.interface"; interface UserFileCreatedPayload { userFileId: string; diff --git a/apps/api/src/modules/data-import/graphql/user-file.resolver.ts b/apps/api/src/modules/data-import/graphql/user-file.resolver.ts index 147bf79..2c3a169 100644 --- a/apps/api/src/modules/data-import/graphql/user-file.resolver.ts +++ b/apps/api/src/modules/data-import/graphql/user-file.resolver.ts @@ -1,6 +1,5 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { AuthorizationService, User as DomainUser } 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/data-import/graphql/user-file.type.ts b/apps/api/src/modules/data-import/graphql/user-file.type.ts index dedaf26..8764f1f 100644 --- a/apps/api/src/modules/data-import/graphql/user-file.type.ts +++ b/apps/api/src/modules/data-import/graphql/user-file.type.ts @@ -1,6 +1,6 @@ import { Field, Int, ObjectType } from "@nestjs/graphql"; import GraphQLJSON from "graphql-type-json"; -import type { UserFile as UserFileDomain } from "../user-file.entity"; +import { UserFile as UserFileDomain } from "../user-file.entity"; @ObjectType() export class UserFileType { diff --git a/apps/api/src/modules/data-import/import-job.mapper.ts b/apps/api/src/modules/data-import/import-job.mapper.ts index 79bd512..7358879 100644 --- a/apps/api/src/modules/data-import/import-job.mapper.ts +++ b/apps/api/src/modules/data-import/import-job.mapper.ts @@ -1,6 +1,6 @@ -import type { BaseMapper } from "@cv/core"; +import { BaseMapper } from "@cv/core"; import { Injectable } from "@nestjs/common"; -import type { Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; type PrismaImportJob = Prisma.ImportJobGetPayload; 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 1fc7f68..df69f4f 100644 --- a/apps/api/src/modules/data-import/import-job.policy.ts +++ b/apps/api/src/modules/data-import/import-job.policy.ts @@ -1,4 +1,4 @@ -import type { IPolicy, User } from "@cv/core"; +import { IPolicy, User } from "@cv/core"; import { Policy } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { ImportJob } from "./import-job.entity"; diff --git a/apps/api/src/modules/data-import/import.service.ts b/apps/api/src/modules/data-import/import.service.ts index f5baefb..920b216 100644 --- a/apps/api/src/modules/data-import/import.service.ts +++ b/apps/api/src/modules/data-import/import.service.ts @@ -1,8 +1,6 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; -import { EventService } from "@cv/core"; +import { EventService, PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; -import type { DataImportSource } from "./data-import-source.interface"; +import { DataImportSource } from "./data-import-source.interface"; import { UserFileCreatedEvent } from "./events/user-file-created.event"; import { UserFile } from "./user-file.entity"; import { UserFileMapper } from "./user-file.mapper"; @@ -40,7 +38,12 @@ export class ImportService { user: User, profileId: string, source: DataImportSource, - file: { fileName: string; mimeType: string; sizeBytes: number; fingerprint?: string }, + file: { + fileName: string; + mimeType: string; + sizeBytes: number; + fingerprint?: string; + }, params: Record, ): Promise { const record = await this.prisma.userFile.create({ 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 689485a..cf66502 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 @@ -1,13 +1,8 @@ -import type { ParsedCVData } from "@cv/ai-parser"; -import { PrismaService } from "@cv/core"; +import { ParsedCVData } from "@cv/ai-parser"; +import { 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 { ProfileService } from "@cv/core"; +import { EntityResolverService, type ResolvedEducation, type ResolvedJobExperience } from "@/modules/cv-parser/entity-resolver.service"; import { UserFileCreatedEvent } from "../events/user-file-created.event"; interface ResolvedResult { @@ -75,7 +70,9 @@ export class ImportJobListener { `${tag} Parsed: ${parsed.jobExperiences.length} job(s), ` + `${parsed.education.length} education(s), ${parsed.skills.length} skill(s)`, ); - this.logger.debug(`${tag} Parsed result: ${JSON.stringify(parsed, null, 2)}`); + this.logger.debug( + `${tag} Parsed result: ${JSON.stringify(parsed, null, 2)}`, + ); await this.updateStatusMessage(jobId, userFileId, "Resolving entities"); const resolved = await this.resolveEntities(parsed); @@ -90,7 +87,10 @@ export class ImportJobListener { await this.completeJob(jobId, userFileId, resolved); } catch (err) { const message = err instanceof Error ? err.message : "Processing failed"; - this.logger.error(`${tag} Import failed: ${message}`, err instanceof Error ? err.stack : undefined); + this.logger.error( + `${tag} Import failed: ${message}`, + err instanceof Error ? err.stack : undefined, + ); await this.failJob(jobId, userFileId, message); } } @@ -174,14 +174,20 @@ export class ImportJobListener { } if (Object.keys(updates).length === 0) { - this.logger.debug(`${tag} Profile already has data, skipping auto-populate`); + this.logger.debug( + `${tag} Profile already has data, skipping auto-populate`, + ); return; } await this.profileService.updateProfile(profileId, updates); - this.logger.log(`${tag} Auto-populated profile: ${Object.keys(updates).join(", ")}`); + this.logger.log( + `${tag} Auto-populated profile: ${Object.keys(updates).join(", ")}`, + ); } catch (err) { - this.logger.warn(`${tag} Failed to auto-populate profile (non-fatal): ${err instanceof Error ? err.message : err}`); + this.logger.warn( + `${tag} Failed to auto-populate profile (non-fatal): ${err instanceof Error ? err.message : err}`, + ); } } 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 496e3eb..a1b9613 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 @@ -1,25 +1,32 @@ import { CVParserService as CVParser, - type ExistingUserContext, - type ParsedCVData, + ExistingUserContext, + ParsedCVData, } from "@cv/ai-parser"; -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; -import { TextExtractorRegistry, TEXT_EXTRACTOR_REGISTRY } from "@cv/file-upload"; +import { 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 { EducationService } from "@cv/core"; import { AIProviderResolverService } from "@/modules/cv-parser/ai-provider-resolver.service"; -import { UserJobExperienceService } from "@cv/core"; -import { ProfileService } from "@cv/core"; -import type { DataImportSource } from "../data-import-source.interface"; +import { DataImportSource } from "../data-import-source.interface"; /** * Build ExistingUserContext from domain models for AI prompt enrichment. */ const buildExistingUserContext = ( profile: { fullName?: string | null; headline?: string | null } | null, - jobs: Array<{ company: { name: string }; role: { name: string }; startDate: Date; endDate?: Date }>, - educations: Array<{ institution: { name: string }; degree: string; startDate: Date; endDate: Date | null }>, + jobs: Array<{ + company: { name: string }; + role: { name: string }; + startDate: Date; + endDate?: Date; + }>, + educations: Array<{ + institution: { name: string }; + degree: string; + startDate: Date; + endDate: Date | null; + }>, ): ExistingUserContext | undefined => { const context: ExistingUserContext = {}; @@ -28,7 +35,12 @@ const buildExistingUserContext = ( if (jobs.length > 0) { context.jobs = jobs.map((j) => { - const entry: { company: string; role: string; startDate: string; endDate?: string } = { + const entry: { + company: string; + role: string; + startDate: string; + endDate?: string; + } = { company: j.company.name, role: j.role.name, startDate: j.startDate.toISOString().slice(0, 10), @@ -40,7 +52,12 @@ const buildExistingUserContext = ( if (educations.length > 0) { context.education = educations.map((e) => { - const entry: { institution: string; degree: string; startDate: string; endDate?: string } = { + const entry: { + institution: string; + degree: string; + startDate: string; + endDate?: string; + } = { institution: e.institution.name, degree: e.degree, startDate: e.startDate.toISOString().slice(0, 10), @@ -96,8 +113,12 @@ export class FileImportSource implements DataImportSource { throw new Error("Could not extract any text from the file"); } - this.logger.log(`Extracted ${extraction.text.length} chars from ${mimeType}`); - this.logger.debug(`Extracted text preview: ${extraction.text.slice(0, 500)}`); + this.logger.log( + `Extracted ${extraction.text.length} chars from ${mimeType}`, + ); + this.logger.debug( + `Extracted text preview: ${extraction.text.slice(0, 500)}`, + ); await onStatus("Gathering existing profile data"); @@ -114,7 +135,9 @@ export class FileImportSource implements DataImportSource { return result; } - private async gatherUserContext(user: User): Promise { + private async gatherUserContext( + user: User, + ): Promise { try { const firstProfile = await this.prisma.profile.findFirst({ where: { userId: user.id }, diff --git a/apps/api/src/modules/data-import/user-file.mapper.ts b/apps/api/src/modules/data-import/user-file.mapper.ts index 1542dcd..f68f96c 100644 --- a/apps/api/src/modules/data-import/user-file.mapper.ts +++ b/apps/api/src/modules/data-import/user-file.mapper.ts @@ -1,6 +1,6 @@ -import type { BaseMapper } from "@cv/core"; +import { BaseMapper } from "@cv/core"; import { Injectable } from "@nestjs/common"; -import type { Prisma } from "@prisma/client"; +import { Prisma } from "@prisma/client"; type PrismaUserFile = Prisma.UserFileGetPayload; 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 f5c55f2..696ebb6 100644 --- a/apps/api/src/modules/data-import/user-file.policy.ts +++ b/apps/api/src/modules/data-import/user-file.policy.ts @@ -1,5 +1,5 @@ -import { Policy, ProfileOwnedResourcePolicy } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { + Policy, PrismaService, ProfileOwnedResourcePolicy, } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { UserFile } from "./user-file.entity"; diff --git a/apps/api/src/modules/database/seed/seed.service.ts b/apps/api/src/modules/database/seed/seed.service.ts index 228f6f1..33cc8da 100644 --- a/apps/api/src/modules/database/seed/seed.service.ts +++ b/apps/api/src/modules/database/seed/seed.service.ts @@ -1,7 +1,7 @@ import { PrismaService } from "@cv/core"; -import { Injectable, Logger, OnModuleInit } from "@nestjs/common"; +import { Injectable, Logger, type OnModuleInit } from "@nestjs/common"; import { DiscoveryService } from "@nestjs/core"; -import type { SeederConfig } from "./seeder.decorator"; +import { SeederConfig } from "./seeder.decorator"; import { SEEDER_METADATA_KEY } from "./seeder.decorator"; import { topologicalSort } from "./topological-sort"; @@ -42,7 +42,7 @@ export class SeedService implements OnModuleInit { const providers = this.discoveryService.getProviders(); for (const wrapper of providers) { - if (!wrapper.isDependencyTreeStatic() || !wrapper.instance) continue; + if (!(wrapper.isDependencyTreeStatic() && wrapper.instance)) continue; const instance = wrapper.instance; const seederMetadata = Reflect.getMetadata( diff --git a/apps/api/src/modules/database/seed/topological-sort.spec.ts b/apps/api/src/modules/database/seed/topological-sort.spec.ts index dafdef8..871bf26 100644 --- a/apps/api/src/modules/database/seed/topological-sort.spec.ts +++ b/apps/api/src/modules/database/seed/topological-sort.spec.ts @@ -71,17 +71,13 @@ describe("topologicalSort", () => { it("throws on unknown dependency names", () => { expect(() => - topologicalSort([ - { name: "A", dependsOn: ["NonExistent"], value: 1 }, - ]), + topologicalSort([{ name: "A", dependsOn: ["NonExistent"], value: 1 }]), ).toThrow("Unknown seeder dependencies: NonExistent"); }); it("preserves values through sorting", () => { const obj = { data: "test" }; - const result = topologicalSort([ - { name: "A", dependsOn: [], value: obj }, - ]); + const result = topologicalSort([{ name: "A", dependsOn: [], value: obj }]); expect("sorted" in result).toBe(true); if (!("sorted" in result)) return; diff --git a/apps/api/src/modules/education/education.module.ts b/apps/api/src/modules/education/education.module.ts index a9dc517..45de2fb 100644 --- a/apps/api/src/modules/education/education.module.ts +++ b/apps/api/src/modules/education/education.module.ts @@ -1,18 +1,21 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + EducationMapper, + EducationPolicy, + EducationService, + InstitutionFactory, + InstitutionMapper, + InstitutionPolicy, + InstitutionService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { SkillModule } from "@/modules/job-experience/skill/skill.module"; -import { EducationMapper } from "@cv/core"; -import { EducationPolicy } from "@cv/core"; -import { EducationService } from "@cv/core"; import { EducationResolver } from "./graphql/education.resolver"; import { InstitutionResolver } from "./graphql/institution.resolver"; import { EducationUserFieldResolver } from "./graphql/user-field.resolver"; -import { InstitutionFactory } from "@cv/core"; -import { InstitutionMapper } from "@cv/core"; -import { InstitutionPolicy } from "@cv/core"; -import { InstitutionService } from "@cv/core"; import { EducationOnboardingStep } from "./onboarding/education.step"; @Module({ diff --git a/apps/api/src/modules/education/graphql/education.resolver.ts b/apps/api/src/modules/education/graphql/education.resolver.ts index 5dba602..b8aa92d 100644 --- a/apps/api/src/modules/education/graphql/education.resolver.ts +++ b/apps/api/src/modules/education/graphql/education.resolver.ts @@ -1,13 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, 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"; -import { InstitutionService } from "@cv/core"; -import { SkillService } from "@cv/core"; -import { Education as EducationEntity } from "@cv/core"; -import { EducationService } from "@cv/core"; import { Education } from "./education.type"; @Resolver(() => Education) diff --git a/apps/api/src/modules/education/graphql/education.type.ts b/apps/api/src/modules/education/graphql/education.type.ts index c21123e..a820677 100644 --- a/apps/api/src/modules/education/graphql/education.type.ts +++ b/apps/api/src/modules/education/graphql/education.type.ts @@ -1,8 +1,10 @@ +import { + Education as EducationEntity, + Education as EducationEntityType, +} from "@cv/core"; import { Field, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; import { Skill } from "@/modules/job-experience/skill/graphql/skill.type"; -import type { Education as EducationEntityType } from "@cv/core"; -import { Education as EducationEntity } from "@cv/core"; import { Institution } from "./institution.type"; @ObjectType() diff --git a/apps/api/src/modules/education/graphql/institution.resolver.ts b/apps/api/src/modules/education/graphql/institution.resolver.ts index 9f9bfdc..de98129 100644 --- a/apps/api/src/modules/education/graphql/institution.resolver.ts +++ b/apps/api/src/modules/education/graphql/institution.resolver.ts @@ -1,12 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, 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"; -import { Institution as InstitutionEntity } from "@cv/core"; -import { InstitutionFactory } from "@cv/core"; -import { InstitutionService } from "@cv/core"; import { Institution } from "./institution.type"; @Resolver(() => Institution) diff --git a/apps/api/src/modules/education/graphql/institution.type.ts b/apps/api/src/modules/education/graphql/institution.type.ts index bff8b79..733ece6 100644 --- a/apps/api/src/modules/education/graphql/institution.type.ts +++ b/apps/api/src/modules/education/graphql/institution.type.ts @@ -1,5 +1,5 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { Institution as InstitutionDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; const { Type, Connection, Edge } = createNamedGraphQLType( "Institution", 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 b6cc7f7..40a2adf 100644 --- a/apps/api/src/modules/education/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/education/graphql/user-field.resolver.ts @@ -1,9 +1,8 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { 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"; -import { EducationService } from "@cv/core"; import { EducationConnection } from "./education.type"; @Resolver(() => User) diff --git a/apps/api/src/modules/education/onboarding/education.step.ts b/apps/api/src/modules/education/onboarding/education.step.ts index db341ac..d5c669e 100644 --- a/apps/api/src/modules/education/onboarding/education.step.ts +++ b/apps/api/src/modules/education/onboarding/education.step.ts @@ -1,5 +1,4 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { OnboardingStep } from "@/modules/onboarding/onboarding-step.decorator"; import { 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 043b207..6effe79 100644 --- a/apps/api/src/modules/job-experience/company/company.dataloader.ts +++ b/apps/api/src/modules/job-experience/company/company.dataloader.ts @@ -1,7 +1,6 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { + BaseDataLoaderService, Company, CompanyService, } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { Company } from "@cv/core"; -import { CompanyService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) export class CompanyDataLoaderService extends BaseDataLoaderService< diff --git a/apps/api/src/modules/job-experience/company/company.module.ts b/apps/api/src/modules/job-experience/company/company.module.ts index 73df0d2..e263b55 100644 --- a/apps/api/src/modules/job-experience/company/company.module.ts +++ b/apps/api/src/modules/job-experience/company/company.module.ts @@ -1,12 +1,15 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + CompanyFactory, + CompanyMapper, + CompanyPolicy, + CompanyService, + DatabaseModule, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; -import { CompanyService } from "@cv/core"; import { CompanyDataLoaderService } from "./company.dataloader"; -import { CompanyFactory } from "@cv/core"; -import { CompanyMapper } from "@cv/core"; -import { CompanyPolicy } from "@cv/core"; import { CompanyResolver } from "./graphql/company.resolver"; @Module({ 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 ca90012..0b643df 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,16 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, Company, Company as CompanyEntity, CompanyFactory, CompanyService, 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"; -import { - Company, - Company as CompanyEntity, -} from "@cv/core"; -import { CompanyFactory } from "@cv/core"; -import { CompanyService } from "@cv/core"; import { CompanyConnection, Company as CompanyGraphQL } from "./company.type"; import { CompanyConnectionArgs } from "./company-connection-args.type"; 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 7288786..9d3659c 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,9 @@ +import { + Company as CompanyDomain, + Company as DomainCompany, +} from "@cv/core"; import { Field, ID, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; -import type { Company as DomainCompany } from "@cv/core"; -import { Company as CompanyDomain } from "@cv/core"; @ObjectType() export class Company { diff --git a/apps/api/src/modules/job-experience/employment/employment.module.ts b/apps/api/src/modules/job-experience/employment/employment.module.ts index bca3ce1..a8e06e0 100644 --- a/apps/api/src/modules/job-experience/employment/employment.module.ts +++ b/apps/api/src/modules/job-experience/employment/employment.module.ts @@ -1,5 +1,11 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + UserJobExperienceMapper, + UserJobExperiencePolicy, + UserJobExperienceService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { CompanyModule } from "@/modules/job-experience/company/company.module"; @@ -9,9 +15,6 @@ import { SkillModule } from "@/modules/job-experience/skill/skill.module"; import { EmploymentResolver } from "./graphql/employment.resolver"; import { UserFieldResolver } from "./graphql/user-field.resolver"; import { CareerHistoryOnboardingStep } from "./onboarding/career-history.step"; -import { UserJobExperienceMapper } from "@cv/core"; -import { UserJobExperiencePolicy } from "@cv/core"; -import { UserJobExperienceService } from "@cv/core"; @Module({ imports: [ 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 80dd327..af2c1a7 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,19 +1,14 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { UseGuards } from "@nestjs/common"; -import { Args, Mutation, Resolver } from "@nestjs/graphql"; -import { CurrentUser } from "@/modules/current-user/current-user.decorator"; -import { CompanyService } from "@cv/core"; -import type { +import { CreateUserJobExperienceDto, + User as DomainUser, UpdateUserJobExperienceDto, } from "@cv/core"; -import { UserJobExperience as UserJobExperienceEntity } from "@cv/core"; -import { UserJobExperienceService } from "@cv/core"; -import { LevelService } from "@cv/core"; -import { RoleService } from "@cv/core"; -import { SkillService } 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"; import { UserJobExperience } from "./user-job-experience.type"; @Resolver(() => UserJobExperience) 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 62e4660..edb7809 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,8 +1,7 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationArgs, PaginationService, PrismaService } 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 { UserJobExperienceService } from "@cv/core"; import { User } from "@/modules/user/user.type"; import { UserJobExperienceConnection } from "./user-job-experience.type"; diff --git a/apps/api/src/modules/job-experience/employment/graphql/user-job-experience.type.ts b/apps/api/src/modules/job-experience/employment/graphql/user-job-experience.type.ts index 9c2abef..1ebff00 100644 --- a/apps/api/src/modules/job-experience/employment/graphql/user-job-experience.type.ts +++ b/apps/api/src/modules/job-experience/employment/graphql/user-job-experience.type.ts @@ -1,12 +1,14 @@ +import { + UserJobExperience as DomainUserJobExperience, + Skill as SkillDomain, + UserJobExperience as UserJobExperienceEntity, +} from "@cv/core"; import { Field, ID, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; import { Company } from "@/modules/job-experience/company/graphql/company.type"; -import type { UserJobExperience as DomainUserJobExperience } from "@cv/core"; -import { UserJobExperience as UserJobExperienceEntity } from "@cv/core"; import { Level } from "@/modules/job-experience/level/graphql/level.type"; import { Role } from "@/modules/job-experience/role/graphql/role.type"; import { Skill } from "@/modules/job-experience/skill/graphql/skill.type"; -import type { Skill as SkillDomain } from "@cv/core"; @ObjectType() export class UserJobExperience { diff --git a/apps/api/src/modules/job-experience/employment/onboarding/career-history.step.ts b/apps/api/src/modules/job-experience/employment/onboarding/career-history.step.ts index d4caeeb..3b4d08a 100644 --- a/apps/api/src/modules/job-experience/employment/onboarding/career-history.step.ts +++ b/apps/api/src/modules/job-experience/employment/onboarding/career-history.step.ts @@ -1,5 +1,4 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { OnboardingStep } from "@/modules/onboarding/onboarding-step.decorator"; import { 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 b438f3e..338e4dd 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,13 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, 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"; -import { Level as LevelEntity } from "@cv/core"; -import { LevelFactory } from "@cv/core"; -import { LevelService } from "@cv/core"; import { Level, LevelConnection } from "./level.type"; import { LevelConnectionArgs } from "./level-connection-args.type"; diff --git a/apps/api/src/modules/job-experience/level/graphql/level.type.ts b/apps/api/src/modules/job-experience/level/graphql/level.type.ts index 9034ad5..714abbb 100644 --- a/apps/api/src/modules/job-experience/level/graphql/level.type.ts +++ b/apps/api/src/modules/job-experience/level/graphql/level.type.ts @@ -1,5 +1,5 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { Level as LevelDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; const { Type, Connection, Edge } = createNamedGraphQLType("Level", LevelDomain); 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 d3d764b..7f1604d 100644 --- a/apps/api/src/modules/job-experience/level/level.dataloader.ts +++ b/apps/api/src/modules/job-experience/level/level.dataloader.ts @@ -1,7 +1,5 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { BaseDataLoaderService, Level, LevelService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { Level } from "@cv/core"; -import { LevelService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) export class LevelDataLoaderService extends BaseDataLoaderService< diff --git a/apps/api/src/modules/job-experience/level/level.module.ts b/apps/api/src/modules/job-experience/level/level.module.ts index 5f9705f..f3269a8 100644 --- a/apps/api/src/modules/job-experience/level/level.module.ts +++ b/apps/api/src/modules/job-experience/level/level.module.ts @@ -1,13 +1,16 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + LevelFactory, + LevelMapper, + LevelPolicy, + LevelService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; -import { LevelService } from "@cv/core"; import { LevelResolver } from "./graphql/level.resolver"; import { LevelDataLoaderService } from "./level.dataloader"; -import { LevelFactory } from "@cv/core"; -import { LevelMapper } from "@cv/core"; -import { LevelPolicy } from "@cv/core"; @Module({ imports: [ 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 82c3b74..37fad73 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,13 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, 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"; -import { Role as RoleEntity } from "@cv/core"; -import { RoleFactory } from "@cv/core"; -import { RoleService } from "@cv/core"; import { Role, RoleConnection } from "./role.type"; import { RoleConnectionArgs } from "./role-connection-args.type"; diff --git a/apps/api/src/modules/job-experience/role/graphql/role.type.ts b/apps/api/src/modules/job-experience/role/graphql/role.type.ts index b5282e1..981f114 100644 --- a/apps/api/src/modules/job-experience/role/graphql/role.type.ts +++ b/apps/api/src/modules/job-experience/role/graphql/role.type.ts @@ -1,5 +1,5 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { Role as RoleDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; const { Type, Connection, Edge } = createNamedGraphQLType("Role", RoleDomain); 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 135a66e..e6182a5 100644 --- a/apps/api/src/modules/job-experience/role/role.dataloader.ts +++ b/apps/api/src/modules/job-experience/role/role.dataloader.ts @@ -1,7 +1,5 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { BaseDataLoaderService, Role, RoleService } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { Role } from "@cv/core"; -import { RoleService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) export class RoleDataLoaderService extends BaseDataLoaderService { diff --git a/apps/api/src/modules/job-experience/role/role.module.ts b/apps/api/src/modules/job-experience/role/role.module.ts index 4ccd1b0..d724bc3 100644 --- a/apps/api/src/modules/job-experience/role/role.module.ts +++ b/apps/api/src/modules/job-experience/role/role.module.ts @@ -1,13 +1,16 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + RoleFactory, + RoleMapper, + RolePolicy, + RoleService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; -import { RoleService } from "@cv/core"; import { RoleResolver } from "./graphql/role.resolver"; import { RoleDataLoaderService } from "./role.dataloader"; -import { RoleFactory } from "@cv/core"; -import { RoleMapper } from "@cv/core"; -import { RolePolicy } from "@cv/core"; @Module({ imports: [ diff --git a/apps/api/src/modules/job-experience/seed/job-experience.seed.ts b/apps/api/src/modules/job-experience/seed/job-experience.seed.ts index 839cc75..6710fff 100644 --- a/apps/api/src/modules/job-experience/seed/job-experience.seed.ts +++ b/apps/api/src/modules/job-experience/seed/job-experience.seed.ts @@ -6,7 +6,10 @@ import { Seeder as SeederDecorator } from "@/modules/database/seed/seeder.decora import { ReferenceDataSeedService } from "./reference-data.seed"; @Injectable() -@SeederDecorator({ name: "Job Experiences", dependsOn: ["Users", "Reference Data"] }) +@SeederDecorator({ + name: "Job Experiences", + dependsOn: ["Users", "Reference Data"], +}) export class JobExperienceSeedService implements Seeder { private readonly logger = new Logger(JobExperienceSeedService.name); @@ -42,9 +45,11 @@ export class JobExperienceSeedService implements Seeder { const existingProfile = await prisma.profile.findFirst({ where: { userId: testUser.id }, }); - const profile = existingProfile ?? await prisma.profile.create({ - data: { userId: testUser.id, name: testUser.name }, - }); + const profile = + existingProfile ?? + (await prisma.profile.create({ + data: { userId: testUser.id, name: testUser.name }, + })); // Clear existing job experiences for this profile only this.logger.log("Clearing existing job experiences for test user..."); diff --git a/apps/api/src/modules/job-experience/seed/reference-data.seed.ts b/apps/api/src/modules/job-experience/seed/reference-data.seed.ts index f6e568a..609f91a 100644 --- a/apps/api/src/modules/job-experience/seed/reference-data.seed.ts +++ b/apps/api/src/modules/job-experience/seed/reference-data.seed.ts @@ -165,7 +165,9 @@ export class ReferenceDataSeedService implements Seeder { return Promise.all( names.map(async (name) => { - const existing = await prisma.contractType.findFirst({ where: { name } }); + const existing = await prisma.contractType.findFirst({ + where: { name }, + }); if (existing) return { id: existing.id }; const ct = await prisma.contractType.create({ data: { name } }); return { id: ct.id }; 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 b1408db..39e3846 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,13 +1,10 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, 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"; -import { Skill as SkillEntity } from "@cv/core"; -import { SkillFactory } from "@cv/core"; -import { SkillService } from "@cv/core"; import { Skill, SkillConnection } from "./skill.type"; import { SkillConnectionArgs } from "./skill-connection-args.type"; diff --git a/apps/api/src/modules/job-experience/skill/graphql/skill.type.ts b/apps/api/src/modules/job-experience/skill/graphql/skill.type.ts index dbe9fbc..dad6b3c 100644 --- a/apps/api/src/modules/job-experience/skill/graphql/skill.type.ts +++ b/apps/api/src/modules/job-experience/skill/graphql/skill.type.ts @@ -1,5 +1,5 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { Skill as SkillDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; const { Type, Connection, Edge } = createNamedGraphQLType("Skill", SkillDomain); 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 6ea0b2e..24d654a 100644 --- a/apps/api/src/modules/job-experience/skill/skill.module.ts +++ b/apps/api/src/modules/job-experience/skill/skill.module.ts @@ -1,14 +1,17 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + SkillFactory, + SkillMapper, + SkillPolicy, + SkillService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; -import { SkillService } from "@cv/core"; import { JobExperienceSeedService } from "../seed/job-experience.seed"; import { ReferenceDataSeedService } from "../seed/reference-data.seed"; import { SkillResolver } from "./graphql/skill.resolver"; -import { SkillFactory } from "@cv/core"; -import { SkillMapper } from "@cv/core"; -import { SkillPolicy } from "@cv/core"; @Module({ imports: [ diff --git a/apps/api/src/modules/messenger/logger.provider.ts b/apps/api/src/modules/messenger/logger.provider.ts index ad00320..d03a1e1 100644 --- a/apps/api/src/modules/messenger/logger.provider.ts +++ b/apps/api/src/modules/messenger/logger.provider.ts @@ -1,5 +1,5 @@ import { Logger as NestLogger } from "@nestjs/common"; -import type { Logger } from "@riotbyte-com/project-q-core"; +import { Logger } from "@riotbyte-com/project-q-core"; export class NestProjectQLogger implements Logger { private readonly logger = new NestLogger("ProjectQ"); diff --git a/apps/api/src/modules/messenger/messenger.module.ts b/apps/api/src/modules/messenger/messenger.module.ts index 11851a7..aec7b42 100644 --- a/apps/api/src/modules/messenger/messenger.module.ts +++ b/apps/api/src/modules/messenger/messenger.module.ts @@ -1,5 +1,8 @@ import { Module } from "@nestjs/common"; -import { LoggerProvider, MessengerModule } from "@riotbyte-com/project-q-nestjs"; +import { + LoggerProvider, + MessengerModule, +} from "@riotbyte-com/project-q-nestjs"; import { NestProjectQLogger } from "./logger.provider"; import { PrismaTransportModule } from "./prisma-transport.module"; diff --git a/apps/api/src/modules/messenger/prisma-transport.module.ts b/apps/api/src/modules/messenger/prisma-transport.module.ts index 61f7c48..a287781 100644 --- a/apps/api/src/modules/messenger/prisma-transport.module.ts +++ b/apps/api/src/modules/messenger/prisma-transport.module.ts @@ -1,6 +1,9 @@ -import { Module } from "@nestjs/common"; import { DatabaseModule, PrismaService } from "@cv/core"; -import { PrismaClientToken, PrismaTransportFactory } from "@riotbyte-com/project-q-prisma"; +import { Module } from "@nestjs/common"; +import { + PrismaClientToken, + PrismaTransportFactory, +} from "@riotbyte-com/project-q-prisma"; @Module({ imports: [DatabaseModule], diff --git a/apps/api/src/modules/onboarding/graphql/onboarding.resolver.ts b/apps/api/src/modules/onboarding/graphql/onboarding.resolver.ts index 61330cc..95f95a9 100644 --- a/apps/api/src/modules/onboarding/graphql/onboarding.resolver.ts +++ b/apps/api/src/modules/onboarding/graphql/onboarding.resolver.ts @@ -1,5 +1,5 @@ -import type { User as DomainUser } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; diff --git a/apps/api/src/modules/onboarding/onboarding-step.interface.ts b/apps/api/src/modules/onboarding/onboarding-step.interface.ts index 7969535..b7d2912 100644 --- a/apps/api/src/modules/onboarding/onboarding-step.interface.ts +++ b/apps/api/src/modules/onboarding/onboarding-step.interface.ts @@ -1,4 +1,4 @@ -import type { User } from "@cv/core"; +import { User } from "@cv/core"; export enum OnboardingStepStatus { NOT_STARTED = "NOT_STARTED", diff --git a/apps/api/src/modules/onboarding/onboarding.service.ts b/apps/api/src/modules/onboarding/onboarding.service.ts index 2f0cfd9..ff2acac 100644 --- a/apps/api/src/modules/onboarding/onboarding.service.ts +++ b/apps/api/src/modules/onboarding/onboarding.service.ts @@ -1,9 +1,8 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; -import { Injectable, Logger, OnModuleInit } from "@nestjs/common"; +import { PrismaService, User } from "@cv/core"; +import { Injectable, Logger, type OnModuleInit } from "@nestjs/common"; import { DiscoveryService } from "@nestjs/core"; import { ONBOARDING_STEP_METADATA_KEY } from "./onboarding-step.decorator"; -import type { +import { OnboardingStepDefinition, OnboardingStepStatus, } from "./onboarding-step.interface"; diff --git a/apps/api/src/modules/organization/graphql/membership.type.ts b/apps/api/src/modules/organization/graphql/membership.type.ts index d7f002a..1bbec4d 100644 --- a/apps/api/src/modules/organization/graphql/membership.type.ts +++ b/apps/api/src/modules/organization/graphql/membership.type.ts @@ -1,7 +1,6 @@ -import { UserRole } from "@cv/core"; +import { OrganizationRole, UserRole } from "@cv/core"; import { Field, ObjectType } from "@nestjs/graphql"; import { createConnection } from "@/modules/base/connection.factory"; -import { OrganizationRole } from "@cv/core"; import { User } from "@/modules/user/user.type"; @ObjectType() diff --git a/apps/api/src/modules/organization/graphql/organization.resolver.ts b/apps/api/src/modules/organization/graphql/organization.resolver.ts index 8246928..b8c680c 100644 --- a/apps/api/src/modules/organization/graphql/organization.resolver.ts +++ b/apps/api/src/modules/organization/graphql/organization.resolver.ts @@ -1,7 +1,7 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService, UserService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationService } from "@cv/core"; +import { User as DomainUser, Membership } from "@cv/core"; +import { + AuthorizationService, MembershipSortField, MembershipSortOrder, Organization, OrganizationFactory, OrganizationService, PaginationService, UserService, } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, @@ -12,14 +12,6 @@ import { Resolver, } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; -import { Organization } from "@cv/core"; -import { OrganizationFactory } from "@cv/core"; -import type { Membership } from "@cv/core"; -import { - type MembershipSortField, - type MembershipSortOrder, - OrganizationService, -} from "@cv/core"; import { MembershipConnection } from "./membership.type"; import { MembershipConnectionArgs } from "./membership-connection-args.type"; 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 fbee8ae..ac15691 100644 --- a/apps/api/src/modules/organization/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/organization/graphql/user-field.resolver.ts @@ -1,8 +1,7 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { Organization, OrganizationService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Parent, ResolveField, Resolver } from "@nestjs/graphql"; -import { Organization } from "@cv/core"; -import { OrganizationService } from "@cv/core"; import { User } from "@/modules/user/user.type"; @Resolver(() => User) diff --git a/apps/api/src/modules/organization/organization.module.ts b/apps/api/src/modules/organization/organization.module.ts index 18784d4..120f2c7 100644 --- a/apps/api/src/modules/organization/organization.module.ts +++ b/apps/api/src/modules/organization/organization.module.ts @@ -1,16 +1,19 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + OrganizationFactory, + OrganizationMapper, + OrganizationPolicy, + OrganizationRoleMapper, + OrganizationRolePolicy, + OrganizationRoleService, + OrganizationService, +} 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 { OrganizationFactory } from "@cv/core"; -import { OrganizationMapper } from "@cv/core"; -import { OrganizationPolicy } from "@cv/core"; -import { OrganizationService } from "@cv/core"; -import { OrganizationRoleMapper } from "@cv/core"; -import { OrganizationRolePolicy } from "@cv/core"; -import { OrganizationRoleService } from "@cv/core"; import { MembershipSeedService } from "./seed/membership.seed"; import { OrganizationSeedService } from "./seed/organization.seed"; 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 d6884a2..92e297e 100644 --- a/apps/api/src/modules/profile/graphql/profile-field.resolver.ts +++ b/apps/api/src/modules/profile/graphql/profile-field.resolver.ts @@ -1,12 +1,9 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationArgs, PaginationService } from "@cv/core"; +import { CVService, EducationService, PaginationArgs, PaginationService, UserJobExperienceService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql"; -import { CVService } from "@cv/core"; import { CVConnection } from "@/modules/cv-template/graphql/cv.type"; -import { EducationService } from "@cv/core"; import { EducationConnection } from "@/modules/education/graphql/education.type"; -import { UserJobExperienceService } from "@cv/core"; import { UserJobExperienceConnection } from "@/modules/job-experience/employment/graphql/user-job-experience.type"; import { ProfileType } from "./profile.type"; @@ -52,10 +49,7 @@ export class ProfileFieldResolver { @Args() args: PaginationArgs = {}, ): Promise { const options = this.paginationService.parsePaginationArgs(args); - const result = await this.cvService.findManyForProfile( - profile.id, - options, - ); + const result = await this.cvService.findManyForProfile(profile.id, options); return CVConnection.fromPaginationResult(result); } } diff --git a/apps/api/src/modules/profile/graphql/profile.resolver.ts b/apps/api/src/modules/profile/graphql/profile.resolver.ts index d3af8d5..2c3951f 100644 --- a/apps/api/src/modules/profile/graphql/profile.resolver.ts +++ b/apps/api/src/modules/profile/graphql/profile.resolver.ts @@ -1,5 +1,5 @@ -import { type User as DomainUser, ProfileService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser, ProfileService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, ID, Mutation, Query, Resolver } from "@nestjs/graphql"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; @@ -15,9 +15,7 @@ export class ProfileResolver { constructor(private readonly profileService: ProfileService) {} @Query(() => [ProfileType]) - async myProfiles( - @CurrentUser() user: DomainUser, - ): Promise { + async myProfiles(@CurrentUser() user: DomainUser): Promise { return this.profileService.getProfilesForUser(user.id); } diff --git a/apps/api/src/modules/profile/onboarding/profile.step.ts b/apps/api/src/modules/profile/onboarding/profile.step.ts index 31a32c5..9014962 100644 --- a/apps/api/src/modules/profile/onboarding/profile.step.ts +++ b/apps/api/src/modules/profile/onboarding/profile.step.ts @@ -1,5 +1,4 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { OnboardingStep } from "@/modules/onboarding/onboarding-step.decorator"; import { diff --git a/apps/api/src/modules/profile/profile.module.ts b/apps/api/src/modules/profile/profile.module.ts index 6ef76df..08f8199 100644 --- a/apps/api/src/modules/profile/profile.module.ts +++ b/apps/api/src/modules/profile/profile.module.ts @@ -5,12 +5,12 @@ import { ProfilePolicy, ProfileService, } from "@cv/core"; -import { Module, forwardRef } from "@nestjs/common"; +import { forwardRef, Module } from "@nestjs/common"; import { CVTemplateModule } from "@/modules/cv-template/cv-template.module"; import { EducationModule } from "@/modules/education/education.module"; import { EmploymentModule } from "@/modules/job-experience/employment/employment.module"; -import { ProfileFieldResolver } from "./graphql/profile-field.resolver"; import { ProfileResolver } from "./graphql/profile.resolver"; +import { ProfileFieldResolver } from "./graphql/profile-field.resolver"; import { ProfileOnboardingStep } from "./onboarding/profile.step"; @Module({ diff --git a/apps/api/src/modules/user-settings/onboarding/ai-preference.step.ts b/apps/api/src/modules/user-settings/onboarding/ai-preference.step.ts index fe60d5c..0d32e1e 100644 --- a/apps/api/src/modules/user-settings/onboarding/ai-preference.step.ts +++ b/apps/api/src/modules/user-settings/onboarding/ai-preference.step.ts @@ -1,5 +1,4 @@ -import type { User } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, User } from "@cv/core"; import { Injectable } from "@nestjs/common"; import { OnboardingStep } from "@/modules/onboarding/onboarding-step.decorator"; import { @@ -16,9 +15,9 @@ export class AiPreferenceOnboardingStep implements OnboardingStepDefinition { constructor(private readonly prisma: PrismaService) {} - async computeStatus(user: User): Promise { + async computeStatus({ id }: User): Promise { const settings = await this.prisma.userAiSettings.findUnique({ - where: { userId: user.id }, + where: { userId: id }, }); return settings diff --git a/apps/api/src/modules/user-settings/user-ai-settings.module.ts b/apps/api/src/modules/user-settings/user-ai-settings.module.ts index 97a6467..b25e92f 100644 --- a/apps/api/src/modules/user-settings/user-ai-settings.module.ts +++ b/apps/api/src/modules/user-settings/user-ai-settings.module.ts @@ -1,4 +1,4 @@ -import { AIModule, type AIProviderType } from "@cv/ai-provider"; +import { AIModule, AIProviderType } from "@cv/ai-provider"; import { DatabaseModule } from "@cv/core"; import { Module } from "@nestjs/common"; import { AiPreferenceOnboardingStep } from "./onboarding/ai-preference.step"; diff --git a/apps/api/src/modules/user-settings/user-ai-settings.resolver.ts b/apps/api/src/modules/user-settings/user-ai-settings.resolver.ts index 63460a8..5d0c985 100644 --- a/apps/api/src/modules/user-settings/user-ai-settings.resolver.ts +++ b/apps/api/src/modules/user-settings/user-ai-settings.resolver.ts @@ -1,7 +1,7 @@ -import type { AIProvider } from "@cv/ai-provider"; +import { AIProvider } from "@cv/ai-provider"; import { AI_PROVIDER, registeredProviderTypes } from "@cv/ai-provider"; -import type { User as DomainUser } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; import { Inject, Optional, UseGuards } from "@nestjs/common"; import { Args, Mutation, Query, Resolver } from "@nestjs/graphql"; import { AiPreference } from "@prisma/client"; diff --git a/apps/api/src/modules/user-settings/user-ai-settings.service.ts b/apps/api/src/modules/user-settings/user-ai-settings.service.ts index 1e0decb..7b8844e 100644 --- a/apps/api/src/modules/user-settings/user-ai-settings.service.ts +++ b/apps/api/src/modules/user-settings/user-ai-settings.service.ts @@ -1,12 +1,10 @@ -import type { User } from "@cv/core"; -import { TokenEncryptionService } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { PrismaService, TokenEncryptionService, User } from "@cv/core"; import { BadRequestException, Injectable, NotFoundException, } from "@nestjs/common"; -import type { AiPreference } from "@prisma/client"; +import { AiPreference } from "@prisma/client"; @Injectable() export class UserAiSettingsService { diff --git a/apps/api/src/modules/user/seed/user.seed.ts b/apps/api/src/modules/user/seed/user.seed.ts index e609900..3a8e0d5 100644 --- a/apps/api/src/modules/user/seed/user.seed.ts +++ b/apps/api/src/modules/user/seed/user.seed.ts @@ -1,5 +1,4 @@ -import { CredentialsService, UserService } from "@cv/core"; -import { PrismaService } from "@cv/core"; +import { CredentialsService, PrismaService, UserService } from "@cv/core"; import { Injectable, Logger } from "@nestjs/common"; import { Seeder } from "@/modules/database/seed/seed.service"; import { Seeder as SeederDecorator } from "@/modules/database/seed/seeder.decorator"; diff --git a/apps/api/src/modules/user/user.type.ts b/apps/api/src/modules/user/user.type.ts index df7a40b..2189d46 100644 --- a/apps/api/src/modules/user/user.type.ts +++ b/apps/api/src/modules/user/user.type.ts @@ -1,13 +1,14 @@ -import type { User as DomainUser } from "@cv/core"; +import { User as DomainUser } from "@cv/core"; import { UserRole } from "@cv/core"; import { Field, ID, ObjectType, registerEnumType } from "@nestjs/graphql"; registerEnumType(UserRole, { name: "UserRole" }); + +import { Organization } from "@cv/core"; import { ApplicationConnection } from "@/modules/application/graphql/application.type"; import { CVConnection } from "@/modules/cv-template/graphql/cv.type"; import { EducationConnection } from "@/modules/education/graphql/education.type"; import { UserJobExperienceConnection } from "@/modules/job-experience/employment/graphql/user-job-experience.type"; -import { Organization } from "@cv/core"; import { VacancyConnection } from "@/modules/vacancies/graphql/vacancy.type"; @ObjectType() 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 0f54e63..22c95cb 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,10 +1,12 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { + BaseDataLoaderService, ContractType, ContractTypeService, } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { ContractType } from "@cv/core"; -import { ContractTypeService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) -export class ContractTypeDataLoaderService extends BaseDataLoaderService { +export class ContractTypeDataLoaderService extends BaseDataLoaderService< + string, + ContractType +> { constructor(service: ContractTypeService) { super(async (ids: readonly string[]) => { const items = await service.findMany({ id: [...ids] }); diff --git a/apps/api/src/modules/vacancies/contract-type/contract-type.module.ts b/apps/api/src/modules/vacancies/contract-type/contract-type.module.ts index a53a4b3..4ae2217 100644 --- a/apps/api/src/modules/vacancies/contract-type/contract-type.module.ts +++ b/apps/api/src/modules/vacancies/contract-type/contract-type.module.ts @@ -1,12 +1,18 @@ -import { DatabaseModule } from "@cv/core"; +import { + ContractTypeMapper, + ContractTypeService, + DatabaseModule, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { ContractTypeDataLoaderService } from "./contract-type.dataloader"; -import { ContractTypeMapper } from "@cv/core"; -import { ContractTypeService } from "@cv/core"; @Module({ imports: [DatabaseModule], - providers: [ContractTypeService, ContractTypeMapper, ContractTypeDataLoaderService], + providers: [ + ContractTypeService, + ContractTypeMapper, + ContractTypeDataLoaderService, + ], exports: [ContractTypeService, ContractTypeDataLoaderService], }) export class ContractTypeModule {} diff --git a/apps/api/src/modules/vacancies/contract-type/graphql/contract-type.type.ts b/apps/api/src/modules/vacancies/contract-type/graphql/contract-type.type.ts index 23fb247..8f0c35a 100644 --- a/apps/api/src/modules/vacancies/contract-type/graphql/contract-type.type.ts +++ b/apps/api/src/modules/vacancies/contract-type/graphql/contract-type.type.ts @@ -1,7 +1,10 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { ContractType as ContractTypeDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; -const { Type, Connection, Edge } = createNamedGraphQLType("ContractType", ContractTypeDomain); +const { Type, Connection, Edge } = createNamedGraphQLType( + "ContractType", + ContractTypeDomain, +); export const ContractType = Type; export type ContractType = InstanceType; diff --git a/apps/api/src/modules/vacancies/graphql/user-field.resolver.ts b/apps/api/src/modules/vacancies/graphql/user-field.resolver.ts index 1f37c48..1d3b233 100644 --- a/apps/api/src/modules/vacancies/graphql/user-field.resolver.ts +++ b/apps/api/src/modules/vacancies/graphql/user-field.resolver.ts @@ -1,9 +1,8 @@ import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; -import { PaginationArgs, PaginationService } from "@cv/core"; +import { PaginationArgs, PaginationService, VacancyService } from "@cv/core"; import { UseGuards } from "@nestjs/common"; import { Args, Parent, ResolveField, Resolver } from "@nestjs/graphql"; import { User } from "@/modules/user/user.type"; -import { VacancyService } from "@cv/core"; import { VacancyConnection } from "./vacancy.type"; import { VacancyFilterInput } from "./vacancy-filter.input"; diff --git a/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts b/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts index 80ab836..007542d 100644 --- a/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts +++ b/apps/api/src/modules/vacancies/graphql/vacancy.resolver.ts @@ -1,6 +1,8 @@ -import type { User as DomainUser } from "@cv/core"; -import { AuthorizationService } from "@cv/core"; import { JwtAuthGuard, VerifiedScopeGuard } from "@cv/auth"; +import { User as DomainUser } from "@cv/core"; +import { + AuthorizationService, SkillService, Vacancy as VacancyEntity, VacancyFactory, VacancyService, } from "@cv/core"; +import { compact } from "@cv/utils"; import { UseGuards } from "@nestjs/common"; import { Args, @@ -9,7 +11,6 @@ import { ResolveField, Resolver, } from "@nestjs/graphql"; -import { compact } from "@cv/utils"; import { CurrentUser } from "@/modules/current-user/current-user.decorator"; import { CompanyDataLoaderService } from "@/modules/job-experience/company/company.dataloader"; import { Company } from "@/modules/job-experience/company/graphql/company.type"; @@ -18,16 +19,12 @@ import { LevelDataLoaderService } from "@/modules/job-experience/level/level.dat import { Role } from "@/modules/job-experience/role/graphql/role.type"; import { RoleDataLoaderService } from "@/modules/job-experience/role/role.dataloader"; import { Skill } from "@/modules/job-experience/skill/graphql/skill.type"; -import { SkillService } from "@cv/core"; import { ContractTypeDataLoaderService } from "@/modules/vacancies/contract-type/contract-type.dataloader"; import { ContractType } from "@/modules/vacancies/contract-type/graphql/contract-type.type"; -import { LocationDataLoaderService } from "@/modules/vacancies/location/location.dataloader"; import { Location } from "@/modules/vacancies/location/graphql/location.type"; -import { RateTypeDataLoaderService } from "@/modules/vacancies/rate-type/rate-type.dataloader"; +import { LocationDataLoaderService } from "@/modules/vacancies/location/location.dataloader"; import { RateType } from "@/modules/vacancies/rate-type/graphql/rate-type.type"; -import { Vacancy as VacancyEntity } from "@cv/core"; -import { VacancyFactory } from "@cv/core"; -import { VacancyService } from "@cv/core"; +import { RateTypeDataLoaderService } from "@/modules/vacancies/rate-type/rate-type.dataloader"; import { Vacancy } from "./vacancy.type"; @Resolver(() => Vacancy) @@ -162,7 +159,9 @@ export class VacancyResolver { @ResolveField(() => ContractType, { nullable: true }) async contractType(@Parent() vacancy: Vacancy): Promise { if (!vacancy.contractTypeId) return null; - const contractType = await this.contractTypeDataLoader.load(vacancy.contractTypeId); + const contractType = await this.contractTypeDataLoader.load( + vacancy.contractTypeId, + ); return contractType ? ContractType.fromDomain(contractType) : null; } diff --git a/apps/api/src/modules/vacancies/graphql/vacancy.type.ts b/apps/api/src/modules/vacancies/graphql/vacancy.type.ts index 42b7aae..ca70dbd 100644 --- a/apps/api/src/modules/vacancies/graphql/vacancy.type.ts +++ b/apps/api/src/modules/vacancies/graphql/vacancy.type.ts @@ -1,8 +1,10 @@ +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"; -import type { Vacancy as DomainVacancy } from "@cv/core"; -import { Vacancy as VacancyEntity } from "@cv/core"; @ObjectType() export class Vacancy extends BaseGraphQLType { diff --git a/apps/api/src/modules/vacancies/job-type/job-type.module.ts b/apps/api/src/modules/vacancies/job-type/job-type.module.ts index e778898..f0cc049 100644 --- a/apps/api/src/modules/vacancies/job-type/job-type.module.ts +++ b/apps/api/src/modules/vacancies/job-type/job-type.module.ts @@ -1,8 +1,11 @@ -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + BaseModule, + DatabaseModule, + JobTypeFactory, + JobTypeMapper, + JobTypeService, +} from "@cv/core"; import { Module } from "@nestjs/common"; -import { JobTypeFactory } from "@cv/core"; -import { JobTypeMapper } from "@cv/core"; -import { JobTypeService } from "@cv/core"; @Module({ imports: [DatabaseModule, BaseModule], diff --git a/apps/api/src/modules/vacancies/location/graphql/location.type.ts b/apps/api/src/modules/vacancies/location/graphql/location.type.ts index 5dd1a98..b207346 100644 --- a/apps/api/src/modules/vacancies/location/graphql/location.type.ts +++ b/apps/api/src/modules/vacancies/location/graphql/location.type.ts @@ -1,9 +1,6 @@ +import { Location as LocationDomain, LocationType } from "@cv/core"; import { Field, ID, ObjectType, registerEnumType } from "@nestjs/graphql"; import { BaseGraphQLType } from "@/modules/base/base-graphql-type"; -import { - LocationType, - type Location as LocationDomain, -} from "@cv/core"; registerEnumType(LocationType, { name: "LocationType" }); diff --git a/apps/api/src/modules/vacancies/location/location.dataloader.ts b/apps/api/src/modules/vacancies/location/location.dataloader.ts index ac962ac..de1fd47 100644 --- a/apps/api/src/modules/vacancies/location/location.dataloader.ts +++ b/apps/api/src/modules/vacancies/location/location.dataloader.ts @@ -1,10 +1,12 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { + BaseDataLoaderService, Location, VacancyLocationService, } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { Location } from "@cv/core"; -import { VacancyLocationService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) -export class LocationDataLoaderService extends BaseDataLoaderService { +export class LocationDataLoaderService extends BaseDataLoaderService< + string, + Location +> { constructor(service: VacancyLocationService) { super(async (ids: readonly string[]) => { const items = await service.findMany({ id: [...ids] }); diff --git a/apps/api/src/modules/vacancies/location/location.module.ts b/apps/api/src/modules/vacancies/location/location.module.ts index e571fe8..24b00c1 100644 --- a/apps/api/src/modules/vacancies/location/location.module.ts +++ b/apps/api/src/modules/vacancies/location/location.module.ts @@ -1,12 +1,18 @@ -import { DatabaseModule } from "@cv/core"; +import { + DatabaseModule, + LocationMapper, + VacancyLocationService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { LocationDataLoaderService } from "./location.dataloader"; -import { LocationMapper } from "@cv/core"; -import { VacancyLocationService } from "@cv/core"; @Module({ imports: [DatabaseModule], - providers: [VacancyLocationService, LocationMapper, LocationDataLoaderService], + providers: [ + VacancyLocationService, + LocationMapper, + LocationDataLoaderService, + ], exports: [VacancyLocationService, LocationDataLoaderService], }) export class LocationModule {} diff --git a/apps/api/src/modules/vacancies/rate-type/graphql/rate-type.type.ts b/apps/api/src/modules/vacancies/rate-type/graphql/rate-type.type.ts index a03024c..42a339f 100644 --- a/apps/api/src/modules/vacancies/rate-type/graphql/rate-type.type.ts +++ b/apps/api/src/modules/vacancies/rate-type/graphql/rate-type.type.ts @@ -1,7 +1,10 @@ -import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; import { RateType as RateTypeDomain } from "@cv/core"; +import { createNamedGraphQLType } from "@/modules/base/named-graphql-type.factory"; -const { Type, Connection, Edge } = createNamedGraphQLType("RateType", RateTypeDomain); +const { Type, Connection, Edge } = createNamedGraphQLType( + "RateType", + RateTypeDomain, +); export const RateType = Type; export type RateType = InstanceType; 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 b4cb494..0cade7d 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,10 +1,12 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { + BaseDataLoaderService, RateType, RateTypeService, } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { RateType } from "@cv/core"; -import { RateTypeService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) -export class RateTypeDataLoaderService extends BaseDataLoaderService { +export class RateTypeDataLoaderService extends BaseDataLoaderService< + string, + RateType +> { constructor(service: RateTypeService) { super(async (ids: readonly string[]) => { const items = await service.findMany({ id: [...ids] }); diff --git a/apps/api/src/modules/vacancies/rate-type/rate-type.module.ts b/apps/api/src/modules/vacancies/rate-type/rate-type.module.ts index 197e3fa..e515f89 100644 --- a/apps/api/src/modules/vacancies/rate-type/rate-type.module.ts +++ b/apps/api/src/modules/vacancies/rate-type/rate-type.module.ts @@ -1,8 +1,6 @@ -import { DatabaseModule } from "@cv/core"; +import { DatabaseModule, RateTypeMapper, RateTypeService } from "@cv/core"; import { Module } from "@nestjs/common"; import { RateTypeDataLoaderService } from "./rate-type.dataloader"; -import { RateTypeMapper } from "@cv/core"; -import { RateTypeService } from "@cv/core"; @Module({ imports: [DatabaseModule], diff --git a/apps/api/src/modules/vacancies/seed/vacancy.seed.ts b/apps/api/src/modules/vacancies/seed/vacancy.seed.ts index 1b476eb..a5e4699 100644 --- a/apps/api/src/modules/vacancies/seed/vacancy.seed.ts +++ b/apps/api/src/modules/vacancies/seed/vacancy.seed.ts @@ -5,7 +5,10 @@ import { Seeder } from "@/modules/database/seed/seed.service"; import { Seeder as SeederDecorator } from "@/modules/database/seed/seeder.decorator"; @Injectable() -@SeederDecorator({ name: "Public Vacancies", dependsOn: ["Users", "Reference Data"] }) +@SeederDecorator({ + name: "Public Vacancies", + dependsOn: ["Users", "Reference Data"], +}) export class VacancySeedService implements Seeder { private readonly logger = new Logger(VacancySeedService.name); diff --git a/apps/api/src/modules/vacancies/vacancy.dataloader.ts b/apps/api/src/modules/vacancies/vacancy.dataloader.ts index 44bde93..5a43ddd 100644 --- a/apps/api/src/modules/vacancies/vacancy.dataloader.ts +++ b/apps/api/src/modules/vacancies/vacancy.dataloader.ts @@ -1,7 +1,6 @@ -import { BaseDataLoaderService } from "@cv/core"; +import { + BaseDataLoaderService, Vacancy, VacancyService, } from "@cv/core"; import { Injectable, Scope } from "@nestjs/common"; -import { Vacancy } from "@cv/core"; -import { VacancyService } from "@cv/core"; @Injectable({ scope: Scope.REQUEST }) export class VacancyDataLoaderService extends BaseDataLoaderService< diff --git a/apps/api/src/modules/vacancies/vacancy.module.ts b/apps/api/src/modules/vacancies/vacancy.module.ts index bf7b7c2..74ea770 100644 --- a/apps/api/src/modules/vacancies/vacancy.module.ts +++ b/apps/api/src/modules/vacancies/vacancy.module.ts @@ -1,5 +1,12 @@ -import { AuthorizationModule } from "@cv/core"; -import { BaseModule, DatabaseModule } from "@cv/core"; +import { + AuthorizationModule, + BaseModule, + DatabaseModule, + VacancyFactory, + VacancyMapper, + VacancyPolicy, + VacancyService, +} from "@cv/core"; import { Module } from "@nestjs/common"; import { AuthenticationModule } from "@/modules/authentication/authentication.module"; import { CompanyModule } from "@/modules/job-experience/company/company.module"; @@ -13,10 +20,6 @@ import { LocationModule } from "./location/location.module"; import { RateTypeModule } from "./rate-type/rate-type.module"; import { VacancySeedService } from "./seed/vacancy.seed"; import { VacancyDataLoaderService } from "./vacancy.dataloader"; -import { VacancyFactory } from "@cv/core"; -import { VacancyMapper } from "@cv/core"; -import { VacancyPolicy } from "@cv/core"; -import { VacancyService } from "@cv/core"; @Module({ imports: [ diff --git a/apps/api/test/app-integration.e2e-spec.ts b/apps/api/test/app-integration.e2e-spec.ts index 9a82dac..d88239a 100644 --- a/apps/api/test/app-integration.e2e-spec.ts +++ b/apps/api/test/app-integration.e2e-spec.ts @@ -1,4 +1,4 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { BASIC_ME_QUERY, HEALTH_QUERY, diff --git a/apps/api/test/auth-integration.e2e-spec.ts b/apps/api/test/auth-integration.e2e-spec.ts index cac1d49..a3c8de0 100644 --- a/apps/api/test/auth-integration.e2e-spec.ts +++ b/apps/api/test/auth-integration.e2e-spec.ts @@ -1,4 +1,4 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { BASIC_ME_QUERY, COMPLEX_ME_QUERY, @@ -11,7 +11,7 @@ import { makeAuthenticatedRequest, makeUnauthenticatedRequest, setupTestApp, - type TestUser, + TestUser, } from "./test-utils"; describe("Auth Integration Tests (e2e)", () => { diff --git a/apps/api/test/auth-refresh-token.e2e-spec.ts b/apps/api/test/auth-refresh-token.e2e-spec.ts index d3e7395..ee4a00b 100644 --- a/apps/api/test/auth-refresh-token.e2e-spec.ts +++ b/apps/api/test/auth-refresh-token.e2e-spec.ts @@ -1,4 +1,4 @@ -import { type INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { Test } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "@/modules/app.module"; diff --git a/apps/api/test/auth.e2e-spec.ts b/apps/api/test/auth.e2e-spec.ts index 929e14a..6a98beb 100644 --- a/apps/api/test/auth.e2e-spec.ts +++ b/apps/api/test/auth.e2e-spec.ts @@ -1,6 +1,6 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, type 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.e2e-spec.ts b/apps/api/test/cv-upload.e2e-spec.ts index 1a5fb4c..cd7e7e1 100644 --- a/apps/api/test/cv-upload.e2e-spec.ts +++ b/apps/api/test/cv-upload.e2e-spec.ts @@ -1,8 +1,8 @@ import { readFileSync } from "node:fs"; import { join } from "node:path"; -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, type TestingModule } from "@nestjs/testing"; +import { Test, TestingModule } from "@nestjs/testing"; import request from "supertest"; import { AppModule } from "../src/modules/app.module"; diff --git a/apps/api/test/graphql-optimization.e2e-spec.ts b/apps/api/test/graphql-optimization.e2e-spec.ts index c3b041f..38cfa64 100644 --- a/apps/api/test/graphql-optimization.e2e-spec.ts +++ b/apps/api/test/graphql-optimization.e2e-spec.ts @@ -1,6 +1,6 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, type 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/job-experience-integration.e2e-spec.ts b/apps/api/test/job-experience-integration.e2e-spec.ts index 475b885..7fe321e 100644 --- a/apps/api/test/job-experience-integration.e2e-spec.ts +++ b/apps/api/test/job-experience-integration.e2e-spec.ts @@ -1,4 +1,4 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { ALL_COMPANIES_QUERY, ALL_LEVELS_QUERY, @@ -17,7 +17,7 @@ import { makeAuthenticatedRequest, makeUnauthenticatedRequest, setupTestApp, - type TestUser, + TestUser, } from "./test-utils"; describe("Job Experience Integration Tests (e2e)", () => { diff --git a/apps/api/test/pagination-integration.e2e-spec.ts b/apps/api/test/pagination-integration.e2e-spec.ts index 62bcf32..80519e1 100644 --- a/apps/api/test/pagination-integration.e2e-spec.ts +++ b/apps/api/test/pagination-integration.e2e-spec.ts @@ -1,4 +1,4 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { COMPANIES_PAGINATION_QUERY, LEVELS_PAGINATION_QUERY, diff --git a/apps/api/test/pdf-extraction.integration.ts b/apps/api/test/pdf-extraction.integration.ts index 1a479e8..5f43cf4 100644 --- a/apps/api/test/pdf-extraction.integration.ts +++ b/apps/api/test/pdf-extraction.integration.ts @@ -1,33 +1,34 @@ import { readdirSync, readFileSync } from "node:fs"; import { join } from "node:path"; +import { PdfExtractionStrategy } from "@cv/file-upload"; import { PDFExtractor } from "@cv/file-upload"; -import type { PdfExtractionStrategy } from "@cv/file-upload"; import { describe, expect, it } from "vitest"; /** * Lazy-import strategies to avoid pulling heavy deps at module level. * Each factory returns a fresh strategy instance. */ -const strategyFactories: Record Promise> = { - "pdf-parse": async () => { - const { PdfParseStrategy } = await import( - "@cv/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy" - ); - return new PdfParseStrategy(); - }, - pdf2json: async () => { - const { Pdf2JsonStrategy } = await import( - "@cv/file-upload/src/extractors/pdf/strategies/pdf2json.strategy" - ); - return new Pdf2JsonStrategy(); - }, - "tesseract-ocr": async () => { - const { TesseractOcrStrategy } = await import( - "@cv/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy" - ); - return new TesseractOcrStrategy(); - }, -}; +const strategyFactories: Record Promise> = + { + "pdf-parse": async () => { + const { PdfParseStrategy } = await import( + "@cv/file-upload/src/extractors/pdf/strategies/pdf-parse.strategy" + ); + return new PdfParseStrategy(); + }, + pdf2json: async () => { + const { Pdf2JsonStrategy } = await import( + "@cv/file-upload/src/extractors/pdf/strategies/pdf2json.strategy" + ); + return new Pdf2JsonStrategy(); + }, + "tesseract-ocr": async () => { + const { TesseractOcrStrategy } = await import( + "@cv/file-upload/src/extractors/pdf/strategies/tesseract-ocr.strategy" + ); + return new TesseractOcrStrategy(); + }, + }; const strategyNames = Object.keys(strategyFactories); @@ -46,7 +47,9 @@ describe("PDFExtractor (real-world CVs)", () => { describe("composite extractor", () => { const extractor = new PDFExtractor(); - it.each(pdfFixtures)("extracts non-empty text from %s", async (filename) => { + it.each( + pdfFixtures, + )("extracts non-empty text from %s", async (filename) => { const buffer = readFileSync(join(ASSETS_DIR, filename)); expect(buffer.slice(0, 5).toString()).toBe("%PDF-"); @@ -59,11 +62,17 @@ describe("PDFExtractor (real-world CVs)", () => { 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)}`); + 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}`); + console.log( + `[composite][${filename}] extraction failed: ${result.error}`, + ); expect.fail(`Extraction failed for ${filename}: ${result.error}`); } }); diff --git a/apps/api/test/test-utils.ts b/apps/api/test/test-utils.ts index 0832dcf..bf17285 100644 --- a/apps/api/test/test-utils.ts +++ b/apps/api/test/test-utils.ts @@ -1,6 +1,6 @@ -import type { INestApplication } from "@nestjs/common"; +import { INestApplication } from "@nestjs/common"; import { ConfigModule } from "@nestjs/config"; -import { Test, type 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/tsconfig.json b/apps/api/tsconfig.json index 6cd529d..65426f7 100644 --- a/apps/api/tsconfig.json +++ b/apps/api/tsconfig.json @@ -25,6 +25,10 @@ "strictPropertyInitialization": true, "noImplicitAny": true }, - "include": ["src/**/*.ts", "src/**/*.d.ts", "../../packages/tsconfig/graphql.d.ts"], + "include": [ + "src/**/*.ts", + "src/**/*.d.ts", + "../../packages/tsconfig/graphql.d.ts" + ], "exclude": ["node_modules", "dist", "test", "**/*spec.ts"] } diff --git a/apps/api/vitest.config.ts b/apps/api/vitest.config.ts index a4c94c0..3a1c5ff 100644 --- a/apps/api/vitest.config.ts +++ b/apps/api/vitest.config.ts @@ -12,9 +12,7 @@ export default defineConfig({ environment: "node", testTimeout: 60000, hookTimeout: 60000, - include: [ - "src/**/*.{test,spec}.{ts,tsx}", - ], + include: ["src/**/*.{test,spec}.{ts,tsx}"], exclude: [ "**/node_modules/**", "**/dist/**", diff --git a/apps/client/src/features/profile/components/ProfileSwitcher.tsx b/apps/client/src/features/profile/components/ProfileSwitcher.tsx index 19fa0f5..9df6651 100644 --- a/apps/client/src/features/profile/components/ProfileSwitcher.tsx +++ b/apps/client/src/features/profile/components/ProfileSwitcher.tsx @@ -22,7 +22,12 @@ export const ProfileSwitcher = () => { }; return ( -
+