From 1ae94081d6a1f1aee5f965ad8e5948261bbb887d Mon Sep 17 00:00:00 2001 From: tdurieux Date: Wed, 8 Sep 2021 15:19:38 +0200 Subject: [PATCH] fix: repository refresh will check if new a new commit is available --- src/Repository.ts | 31 +++++++------------------------ src/routes/repository-private.ts | 9 ++++----- src/routes/repository-public.ts | 24 ++++++++++++++++++++++++ 3 files changed, 35 insertions(+), 29 deletions(-) diff --git a/src/Repository.ts b/src/Repository.ts index d2a758a..f6ffaa4 100644 --- a/src/Repository.ts +++ b/src/Repository.ts @@ -141,32 +141,13 @@ export default class Repository { * * @returns void */ - async updateIfNeeded(): Promise { - if ( - this.status == "expired" || - this.status == "expiring" || - this.status == "removing" || - this.status == "removed" - ) { - throw new AnonymousError("repository_expired", this); - } - - const fiveMinuteAgo = new Date(); - fiveMinuteAgo.setMinutes(fiveMinuteAgo.getMinutes() - 5); - if (this.status != "ready") { - if ( - this._model.statusDate < fiveMinuteAgo && - this.status != "preparing" - ) { - await this.updateStatus("preparing"); - await downloadQueue.add(this, { jobId: this.repoId }); - } - throw new AnonymousError("repository_not_ready", this); - } - + async updateIfNeeded(opt?: { force: boolean }): Promise { const yesterday = new Date(); yesterday.setDate(yesterday.getDate() - 1); - if (this._model.options.update && this._model.lastView < yesterday) { + if ( + opt?.force || + (this._model.options.update && this._model.lastView < yesterday) + ) { // Only GitHubBase can be update for the moment if (this.source instanceof GitHubBase) { const branches = await this.source.githubRepository.branches({ @@ -187,6 +168,8 @@ export default class Repository { console.error( `${branch.name} for ${this.source.githubRepository.fullName} is not found` ); + await this.updateStatus("error", "branch_not_found"); + await this.resetSate(); throw new AnonymousError("branch_not_found", this); } this._model.anonymizeDate = new Date(); diff --git a/src/routes/repository-private.ts b/src/routes/repository-private.ts index 5d15f5e..8cb5f85 100644 --- a/src/routes/repository-private.ts +++ b/src/routes/repository-private.ts @@ -72,8 +72,7 @@ router.post( if (repo.owner.id != user.id) { return res.status(401).json({ error: "not_authorized" }); } - await repo.updateStatus("preparing"); - await downloadQueue.add(repo, {jobId: repo.repoId}); + await repo.updateIfNeeded({ force: true }); res.json({ status: repo.status }); } catch (error) { handleError(error, res); @@ -95,7 +94,7 @@ router.delete( return res.status(401).json({ error: "not_authorized" }); } await repo.updateStatus("removing"); - await removeQueue.add(repo, {jobId: repo.repoId}); + await removeQueue.add(repo, { jobId: repo.repoId }); return res.json({ status: repo.status }); } catch (error) { handleError(error, res); @@ -312,7 +311,7 @@ router.post( repo.model.conference = repoUpdate.conference; await repo.updateStatus("preparing"); res.json({ status: repo.status }); - await downloadQueue.add(repo, {jobId: repo.repoId}); + await downloadQueue.add(repo, { jobId: repo.repoId }); } catch (error) { return handleError(error, res); } @@ -376,7 +375,7 @@ router.post("/", async (req: express.Request, res: express.Response) => { } res.send({ status: repo.status }); - downloadQueue.add(new Repository(repo), {jobId: repo.repoId}); + downloadQueue.add(new Repository(repo), { jobId: repo.repoId }); } catch (error) { if (error.message?.indexOf(" duplicate key") > -1) { return handleError( diff --git a/src/routes/repository-public.ts b/src/routes/repository-public.ts index 46149e4..0d0c701 100644 --- a/src/routes/repository-public.ts +++ b/src/routes/repository-public.ts @@ -4,6 +4,8 @@ import * as stream from "stream"; import config from "../../config"; import { getRepo, handleError } from "./route-utils"; +import AnonymousError from "../AnonymousError"; +import { downloadQueue } from "../queue"; const router = express.Router(); @@ -59,6 +61,28 @@ router.get( ) { redirectURL = repo.source.url; } else { + if ( + repo.status == "expired" || + repo.status == "expiring" || + repo.status == "removing" || + repo.status == "removed" + ) { + throw new AnonymousError("repository_expired", this); + } + + const fiveMinuteAgo = new Date(); + fiveMinuteAgo.setMinutes(fiveMinuteAgo.getMinutes() - 5); + if (repo.status != "ready") { + if ( + repo.model.statusDate < fiveMinuteAgo && + repo.status != "preparing" + ) { + await repo.updateStatus("preparing"); + await downloadQueue.add(this, { jobId: repo.repoId }); + } + throw new AnonymousError("repository_not_ready", this); + } + await repo.updateIfNeeded(); }