From 46b165006662d72223df9b37a8be68396ea76bab Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Julian=20T=C3=B6lle?= Date: Sun, 12 Mar 2023 02:13:59 +0100 Subject: [PATCH] feat(api): import listens after first sign in Previously it took a minute until the import was started within the normal loop. This way, we create an import job right after the user logs in for the first time. --- src/users/users.module.ts | 13 +++++++++---- src/users/users.service.spec.ts | 11 +++++++++++ src/users/users.service.ts | 16 ++++++++++++++-- 3 files changed, 34 insertions(+), 6 deletions(-) diff --git a/src/users/users.module.ts b/src/users/users.module.ts index f7f8262..fc0348f 100644 --- a/src/users/users.module.ts +++ b/src/users/users.module.ts @@ -1,11 +1,16 @@ +import { PGBossModule } from "@apricote/nest-pg-boss"; import { Module } from "@nestjs/common"; -import { UserRepository } from "./user.repository"; -import { UsersService } from "./users.service"; -import { UsersController } from "./users.controller"; import { TypeOrmRepositoryModule } from "../database/entity-repository/typeorm-repository.module"; +import { ImportSpotifyJob } from "../sources/jobs"; +import { UserRepository } from "./user.repository"; +import { UsersController } from "./users.controller"; +import { UsersService } from "./users.service"; @Module({ - imports: [TypeOrmRepositoryModule.for([UserRepository])], + imports: [ + TypeOrmRepositoryModule.for([UserRepository]), + PGBossModule.forJobs([ImportSpotifyJob]), + ], providers: [UsersService], exports: [UsersService], controllers: [UsersController], diff --git a/src/users/users.service.spec.ts b/src/users/users.service.spec.ts index fad78e9..5e36806 100644 --- a/src/users/users.service.spec.ts +++ b/src/users/users.service.spec.ts @@ -1,25 +1,36 @@ +import { JobService } from "@apricote/nest-pg-boss"; import { Test, TestingModule } from "@nestjs/testing"; +import { IImportSpotifyJob, ImportSpotifyJob } from "../sources/jobs"; import { UserRepository } from "./user.repository"; import { UsersService } from "./users.service"; describe("UsersService", () => { let service: UsersService; let userRepository: UserRepository; + let importSpotifyJobService: JobService; beforeEach(async () => { const module: TestingModule = await Test.createTestingModule({ providers: [ UsersService, { provide: UserRepository, useFactory: () => ({}) }, + { + provide: ImportSpotifyJob.ServiceProvider.provide, + useFactory: () => ({}), + }, ], }).compile(); service = module.get(UsersService); userRepository = module.get(UserRepository); + importSpotifyJobService = module.get>( + ImportSpotifyJob.ServiceProvider.provide + ); }); it("should be defined", () => { expect(service).toBeDefined(); expect(userRepository).toBeDefined(); + expect(importSpotifyJobService).toBeDefined(); }); }); diff --git a/src/users/users.service.ts b/src/users/users.service.ts index f8ec188..b839606 100644 --- a/src/users/users.service.ts +++ b/src/users/users.service.ts @@ -1,4 +1,6 @@ +import { JobService } from "@apricote/nest-pg-boss"; import { Injectable, NotFoundException } from "@nestjs/common"; +import { IImportSpotifyJob, ImportSpotifyJob } from "../sources/jobs"; import { SpotifyConnection } from "../sources/spotify/spotify-connection.entity"; import { CreateOrUpdateDto } from "./dto/create-or-update.dto"; import { User } from "./user.entity"; @@ -6,7 +8,11 @@ import { UserRepository } from "./user.repository"; @Injectable() export class UsersService { - constructor(private readonly userRepository: UserRepository) {} + constructor( + private readonly userRepository: UserRepository, + @ImportSpotifyJob.Inject() + private readonly importSpotifyJobService: JobService + ) {} async findById(id: string): Promise { const user = await this.userRepository.findOneBy({ id }); @@ -27,7 +33,8 @@ export class UsersService { spotify: { id: data.spotify.id }, }); - if (!user) { + const isNew = !user; + if (isNew) { user = this.userRepository.create({ spotify: { id: data.spotify.id, @@ -42,6 +49,11 @@ export class UsersService { await this.userRepository.save(user); + if (isNew) { + // Make sure that existing listens are crawled immediately + this.importSpotifyJobService.sendOnce({ userID: user.id }, {}, user.id); + } + return user; }