diff --git a/src/lib/db/project-store.ts b/src/lib/db/project-store.ts index 8d6efc3b43..4d19552c44 100644 --- a/src/lib/db/project-store.ts +++ b/src/lib/db/project-store.ts @@ -11,7 +11,14 @@ import { } from '../types/stores/project-store'; import { DEFAULT_ENV } from '../util/constants'; -const COLUMNS = ['id', 'name', 'description', 'created_at', 'health']; +const COLUMNS = [ + 'id', + 'name', + 'description', + 'created_at', + 'health', + 'updated_at', +]; const TABLE = 'projects'; class ProjectStore implements IProjectStore { @@ -74,7 +81,7 @@ class ProjectStore implements IProjectStore { async updateHealth(healthUpdate: IProjectHealthUpdate): Promise { await this.db(TABLE) .where({ id: healthUpdate.id }) - .update({ health: healthUpdate.health }); + .update({ health: healthUpdate.health, updated_at: new Date() }); } async create(project: IProjectInsert): Promise { @@ -197,6 +204,7 @@ class ProjectStore implements IProjectStore { description: row.description, createdAt: row.created_at, health: row.health || 100, + updatedAt: row.updated_at || new Date(), }; } } diff --git a/src/lib/services/project-health-service.ts b/src/lib/services/project-health-service.ts index 24651affb5..0eabecb2d9 100644 --- a/src/lib/services/project-health-service.ts +++ b/src/lib/services/project-health-service.ts @@ -72,6 +72,7 @@ export default class ProjectHealthService { name: project.name, description: project.description, health: project.health, + updatedAt: project.updatedAt, environments, features, members, diff --git a/src/lib/types/model.ts b/src/lib/types/model.ts index 495beb746d..f83f82866a 100644 --- a/src/lib/types/model.ts +++ b/src/lib/types/model.ts @@ -143,6 +143,7 @@ export interface IProjectOverview { members: number; version: number; health: number; + updatedAt?: Date; } export interface IProjectHealthReport extends IProjectOverview { @@ -309,6 +310,7 @@ export interface IProject { description: string; health?: number; createdAt?: Date; + updatedAt?: Date; } export interface IProjectWithCount extends IProject { diff --git a/src/lib/types/stores/project-store.ts b/src/lib/types/stores/project-store.ts index adcff6168e..9d0448e066 100644 --- a/src/lib/types/stores/project-store.ts +++ b/src/lib/types/stores/project-store.ts @@ -5,6 +5,7 @@ export interface IProjectInsert { id: string; name: string; description: string; + updatedAt?: Date; } export interface IProjectArchived { diff --git a/src/migrations/20211130142314-add-updated-at-to-projects.js b/src/migrations/20211130142314-add-updated-at-to-projects.js new file mode 100644 index 0000000000..358c3c9d3e --- /dev/null +++ b/src/migrations/20211130142314-add-updated-at-to-projects.js @@ -0,0 +1,12 @@ +'use strict'; + +exports.up = function (db, callback) { + db.runSql( + 'ALTER TABLE projects ADD COLUMN "updated_at" TIMESTAMP WITH TIME ZONE DEFAULT now();', + callback, + ); +}; + +exports.down = function (db, callback) { + db.runSql('ALTER TABLE projects DROP COLUMN "updated_at";', callback); +}; diff --git a/src/test/e2e/api/admin/project/project.health.e2e.test.ts b/src/test/e2e/api/admin/project/project.health.e2e.test.ts index a10daed317..f303329e12 100644 --- a/src/test/e2e/api/admin/project/project.health.e2e.test.ts +++ b/src/test/e2e/api/admin/project/project.health.e2e.test.ts @@ -302,3 +302,16 @@ test('Sorts environments correctly if sort order is equal', async () => { expect(feature.environments[1].name).toBe(envTwo); }); }); + +test('Update update_at when setHealth runs', async () => { + await app.services.projectHealthService.setHealthRating(); + await app.request + .get('/api/admin/projects/default/health-report') + .expect(200) + .expect('Content-Type', /json/) + .expect((res) => { + let now = new Date().getTime(); + let updatedAt = new Date(res.body.updatedAt).getTime(); + expect(now - updatedAt).toBeLessThan(5000); + }); +}); diff --git a/src/test/e2e/stores/project-store.e2e.test.ts b/src/test/e2e/stores/project-store.e2e.test.ts index 48d2a8f7d9..fa665769e4 100644 --- a/src/test/e2e/stores/project-store.e2e.test.ts +++ b/src/test/e2e/stores/project-store.e2e.test.ts @@ -39,6 +39,7 @@ test('should create new project', async () => { expect(project.name).toEqual(ret.name); expect(project.description).toEqual(ret.description); expect(ret.createdAt).toBeTruthy(); + expect(ret.updatedAt).toBeTruthy(); expect(exists).toBe(true); });