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.
This commit is contained in:
Julian Tölle 2023-03-12 02:13:59 +01:00
parent 14478a5418
commit 46b1650066
3 changed files with 34 additions and 6 deletions

View file

@ -1,11 +1,16 @@
import { PGBossModule } from "@apricote/nest-pg-boss";
import { Module } from "@nestjs/common"; 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 { 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({ @Module({
imports: [TypeOrmRepositoryModule.for([UserRepository])], imports: [
TypeOrmRepositoryModule.for([UserRepository]),
PGBossModule.forJobs([ImportSpotifyJob]),
],
providers: [UsersService], providers: [UsersService],
exports: [UsersService], exports: [UsersService],
controllers: [UsersController], controllers: [UsersController],

View file

@ -1,25 +1,36 @@
import { JobService } from "@apricote/nest-pg-boss";
import { Test, TestingModule } from "@nestjs/testing"; import { Test, TestingModule } from "@nestjs/testing";
import { IImportSpotifyJob, ImportSpotifyJob } from "../sources/jobs";
import { UserRepository } from "./user.repository"; import { UserRepository } from "./user.repository";
import { UsersService } from "./users.service"; import { UsersService } from "./users.service";
describe("UsersService", () => { describe("UsersService", () => {
let service: UsersService; let service: UsersService;
let userRepository: UserRepository; let userRepository: UserRepository;
let importSpotifyJobService: JobService<IImportSpotifyJob>;
beforeEach(async () => { beforeEach(async () => {
const module: TestingModule = await Test.createTestingModule({ const module: TestingModule = await Test.createTestingModule({
providers: [ providers: [
UsersService, UsersService,
{ provide: UserRepository, useFactory: () => ({}) }, { provide: UserRepository, useFactory: () => ({}) },
{
provide: ImportSpotifyJob.ServiceProvider.provide,
useFactory: () => ({}),
},
], ],
}).compile(); }).compile();
service = module.get<UsersService>(UsersService); service = module.get<UsersService>(UsersService);
userRepository = module.get<UserRepository>(UserRepository); userRepository = module.get<UserRepository>(UserRepository);
importSpotifyJobService = module.get<JobService<IImportSpotifyJob>>(
ImportSpotifyJob.ServiceProvider.provide
);
}); });
it("should be defined", () => { it("should be defined", () => {
expect(service).toBeDefined(); expect(service).toBeDefined();
expect(userRepository).toBeDefined(); expect(userRepository).toBeDefined();
expect(importSpotifyJobService).toBeDefined();
}); });
}); });

View file

@ -1,4 +1,6 @@
import { JobService } from "@apricote/nest-pg-boss";
import { Injectable, NotFoundException } from "@nestjs/common"; import { Injectable, NotFoundException } from "@nestjs/common";
import { IImportSpotifyJob, ImportSpotifyJob } from "../sources/jobs";
import { SpotifyConnection } from "../sources/spotify/spotify-connection.entity"; import { SpotifyConnection } from "../sources/spotify/spotify-connection.entity";
import { CreateOrUpdateDto } from "./dto/create-or-update.dto"; import { CreateOrUpdateDto } from "./dto/create-or-update.dto";
import { User } from "./user.entity"; import { User } from "./user.entity";
@ -6,7 +8,11 @@ import { UserRepository } from "./user.repository";
@Injectable() @Injectable()
export class UsersService { export class UsersService {
constructor(private readonly userRepository: UserRepository) {} constructor(
private readonly userRepository: UserRepository,
@ImportSpotifyJob.Inject()
private readonly importSpotifyJobService: JobService<IImportSpotifyJob>
) {}
async findById(id: string): Promise<User> { async findById(id: string): Promise<User> {
const user = await this.userRepository.findOneBy({ id }); const user = await this.userRepository.findOneBy({ id });
@ -27,7 +33,8 @@ export class UsersService {
spotify: { id: data.spotify.id }, spotify: { id: data.spotify.id },
}); });
if (!user) { const isNew = !user;
if (isNew) {
user = this.userRepository.create({ user = this.userRepository.create({
spotify: { spotify: {
id: data.spotify.id, id: data.spotify.id,
@ -42,6 +49,11 @@ export class UsersService {
await this.userRepository.save(user); 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; return user;
} }