Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
63 commits
Select commit Hold shift + click to select a range
43c5ebb
chore(poster): rename local poster to static poster
LarsvanDartel Mar 31, 2026
f81a44e
feat(poster): added database entitites for local posters
LarsvanDartel Mar 31, 2026
2eb5e4f
feat(poster): added borrelMode property to local poster entities
Wand3rerz Apr 15, 2026
bcb8536
chore(formatting): ran prettier
Wand3rerz Apr 15, 2026
28dae0e
feat(poster): added API stubs for local poster management
Wand3rerz Apr 15, 2026
976a53e
feat(poster): added stub functions in local poster service
Wand3rerz Apr 15, 2026
df97661
feat(poster): implemented controller functions
Wand3rerz Apr 15, 2026
b2bc014
chore: added comments to functions in local poster service
Wand3rerz Apr 15, 2026
13443c8
feat(poster): Revised LocalPoster entity to use PosterType.
Wand3rerz Apr 16, 2026
5867e91
feat(poster): Changed service / controller to use PosterType
Wand3rerz Apr 16, 2026
3ce0b83
feat(poster): Implemented LocalPosterService functions
Wand3rerz Apr 16, 2026
ce22bd1
Chore: Renamed some variables to be more consistent
Wand3rerz Apr 16, 2026
d856892
fix(poster): fixed incorrect handling local poster types in controller
Wand3rerz Apr 16, 2026
f5fedbd
feat(poster): removed notion of enabled
Wand3rerz Apr 16, 2026
3c2f221
feat(poster): Added response for CRUD requests
Wand3rerz Apr 16, 2026
7139afb
fix: added poster type to response
Wand3rerz Apr 18, 2026
e5721e2
feat(poster): added label to LocalPoster entity
Wand3rerz Apr 20, 2026
8aed438
feat(poster): Moved poster-handlers to LocalPoster model
Wand3rerz Apr 22, 2026
13b499e
feat(poster): added enabled field to LocalPoster Entitiy
Wand3rerz Apr 23, 2026
d9efe3c
fix: renamed toggleposter to keep naming scheme intact
Wand3rerz Apr 23, 2026
506d6ed
feat(poster): filter by enabled and due date
Wand3rerz Apr 24, 2026
29ca95b
feat(poster): added featureflag to postercontroller
Wand3rerz Apr 29, 2026
439aa67
feat(poster): added start date to local poster entity and implemented it
Wand3rerz Apr 29, 2026
32c8656
feat(migration): implemented trello migration
Wand3rerz May 7, 2026
16d70be
feat(migration): added static poster migration
Wand3rerz May 12, 2026
85495a2
feat(poster): added album edit for photo posters
Wand3rerz May 12, 2026
59ba423
fix(poster): added check to prevent parsing photo poster multiple times
Wand3rerz May 12, 2026
735e3e9
fix(migration): fixed posters with start date in the future missing
Wand3rerz May 12, 2026
3657952
fix: added flag to prevent duplicate posters on all lists
Wand3rerz May 21, 2026
31ffcc1
feat(dev): added seeding for default GEWIS posters
Wand3rerz May 26, 2026
3315ab2
feat: added integration security for external screen/handler control
Wand3rerz May 26, 2026
6c7484a
Merge remote-tracking branch 'origin/develop' into feat/local-poster-…
Wand3rerz May 26, 2026
f28cd03
feat: added seeding command for GEWIS default posters only
Wand3rerz May 31, 2026
c7691a0
fix: issue where trello media got added twice
Wand3rerz May 31, 2026
e1a6734
refactor: renamed all instances of localposter to poster and merged enum
Wand3rerz Jun 3, 2026
3fa1f42
fix: fixed issue where posters generated from email stored wrong file
Wand3rerz Jun 4, 2026
59660f4
feat: reintroduced support for multiple imgs in one poster
Wand3rerz Jun 4, 2026
65bf9f9
feat: add better handling of the trello posters
Wand3rerz Jun 8, 2026
86faaaf
feat: refactor poster-service to be cleaner and more in line with api
Wand3rerz Jun 8, 2026
42e1c30
feat: add reordering of carousel posters
Wand3rerz Jun 9, 2026
5335cee
Merge remote-tracking branch 'origin/develop' into feat/local-poster-…
Wand3rerz Jun 9, 2026
94500fa
feat: add migration for poster tables and data migration for static p…
Wand3rerz Jun 10, 2026
251a1fc
feat: add feature flag for trello posters
Wand3rerz Jun 10, 2026
7fa72ab
Merge remote-tracking branch 'origin/develop' into feat/local-poster-…
Wand3rerz Jun 16, 2026
d57930f
Merge branch 'develop' into feat/local-poster-trello-replacement
Wand3rerz Jun 16, 2026
64ae4eb
Apply immediate suggestions from code review
Wand3rerz Jun 16, 2026
c77390c
Apply suggestions from code review
Wand3rerz Jun 17, 2026
9163558
fix: request and update types now defined based on poster entity
Wand3rerz Jun 17, 2026
5ecafdc
fix: make fileRepo and normal repo operate in one transaction
Wand3rerz Jun 17, 2026
5ea9880
fix: cascading delete
Wand3rerz Jun 17, 2026
7019f0a
fix: atomic posterUpdate
Wand3rerz Jun 17, 2026
55f4b0f
chore: added docs to poster entity
Wand3rerz Jun 17, 2026
0579b4e
feat: add file-type package and make file type checking more robust
Wand3rerz Jun 17, 2026
8a0b0aa
feat: replace integer id based ordering with entity ordering for caro…
Wand3rerz Jun 17, 2026
2bbcbf4
fix: removed casting ids to number
Wand3rerz Jun 17, 2026
1acb0f4
fix: made posterservice class level
Wand3rerz Jun 17, 2026
f982c3f
fix: add index.ts to migrations to keep database.ts clean
Wand3rerz Jun 17, 2026
a148789
fix: add poster entities.ts to keep database.ts clean
Wand3rerz Jun 17, 2026
14cde5f
fix: update migration to include review changes
Wand3rerz Jun 17, 2026
b126ce2
Merge branch 'develop' into feat/local-poster-trello-replacement
Wand3rerz Jun 17, 2026
1149085
fix:re-add seed script
Wand3rerz Jun 17, 2026
65f0aa4
fix: fixed bug in migration file caused by wrongly named constraint
Wand3rerz Jun 17, 2026
673bad2
feat: added tests for updated API endpoints
Wand3rerz Jun 18, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
125 changes: 122 additions & 3 deletions integration-test/modules/carousel-poster.spec.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,28 @@
import { describe, beforeAll, it, expect } from 'vitest';
import { TestEnvironment, type TestApp } from '../shared/test-app';
import { expectApiError } from '../shared/response-matchers';
import { expectApiError, expectValidationError } from '../shared/response-matchers';

let testApp: TestApp;

beforeAll(async () => {
testApp = await TestEnvironment.getInstance().getTestApp();
});

/**
* Creates a poster through the API and returns its id.
*/
async function createPoster(): Promise<number> {
const res = await testApp.authorizedAgent.post('/api/handler/screen/poster/items').send({
name: 'Carousel Test Poster',
type: 'img',
footerSize: 'full',
defaultTimeout: 15,
borrelMode: false,
});
expect(res.status).toBe(200);
return res.body.id as number;
}

describe('GET /api/handler/screen/poster/carousel', () => {
it('returns 401 without auth', async () => {
// ACT
Expand All @@ -27,6 +42,110 @@ describe('GET /api/handler/screen/poster/carousel', () => {
});
});

describe('GET /api/handler/screen/poster/carousel/order', () => {
it('returns 401 without auth', async () => {
// ACT
const res = await testApp.unauthorizedAgent.get('/api/handler/screen/poster/carousel/order');

// ASSERT
expectApiError(res, 401);
});

it('returns 200 with an empty array when no order is set', async () => {
// ACT
const res = await testApp.authorizedAgent.get('/api/handler/screen/poster/carousel/order');

// ASSERT
expect(res.status).toBe(200);
expect(res.body).toEqual([]);
});
});

describe('PUT /api/handler/screen/poster/carousel/order', () => {
it('returns 401 without auth', async () => {
// ACT
const res = await testApp.unauthorizedAgent
.put('/api/handler/screen/poster/carousel/order')
.send({ posterIds: [] });

// ASSERT
expectApiError(res, 401);
});

it('returns 400 when posterIds is not an array', async () => {
// ACT
const res = await testApp.authorizedAgent
.put('/api/handler/screen/poster/carousel/order')
.send({ posterIds: 'not-an-array' });

// ASSERT
expectValidationError(res);
});

it('returns 204 with an empty order', async () => {
// ACT
const res = await testApp.authorizedAgent
.put('/api/handler/screen/poster/carousel/order')
.send({ posterIds: [] });

// ASSERT
expect(res.status).toBe(204);
});

it('returns 204 and persists the given order', async () => {
// ARRANGE
const id = await createPoster();

// ACT
const res = await testApp.authorizedAgent
.put('/api/handler/screen/poster/carousel/order')
.send({ posterIds: [id] });

// ASSERT
expect(res.status).toBe(204);

const order = await testApp.authorizedAgent.get('/api/handler/screen/poster/carousel/order');
expect(order.body).toEqual([id]);
});
});

describe('POST /api/handler/screen/poster/carousel/{id}/enabled', () => {
it('returns 401 without auth', async () => {
// ACT
const res = await testApp.unauthorizedAgent
.post('/api/handler/screen/poster/carousel/1/enabled')
.send({ enabled: true });

// ASSERT
expectApiError(res, 401);
});

it('returns 404 when the poster does not exist', async () => {
// ACT
const res = await testApp.authorizedAgent
.post('/api/handler/screen/poster/carousel/999999/enabled')
.send({ enabled: true });

// ASSERT
expectApiError(res, 404);
});

it('returns 200 and toggles the enabled state of an existing poster', async () => {
// ARRANGE
const id = await createPoster();

// ACT
const res = await testApp.authorizedAgent
.post(`/api/handler/screen/poster/carousel/${id}/enabled`)
.send({ enabled: false });

// ASSERT
expect(res.status).toBe(200);
expect(res.body.id).toBe(id);
expect(res.body.enabled).toBe(false);
});
});

describe('POST /api/handler/screen/poster/carousel/force-update', () => {
it('returns 401 without auth', async () => {
// ACT
Expand All @@ -38,14 +157,14 @@ describe('POST /api/handler/screen/poster/carousel/force-update', () => {
expectApiError(res, 401);
});

it('returns 500 when Trello API is not configured', async () => {
it('returns 204 when authenticated', async () => {
// ACT
const res = await testApp.authorizedAgent.post(
'/api/handler/screen/poster/carousel/force-update',
);

// ASSERT
expect(res.status).toBe(500);
expect(res.status).toBe(204);
});
});

Expand Down
223 changes: 0 additions & 223 deletions integration-test/modules/local-poster.spec.ts

This file was deleted.

Loading
Loading