diff --git a/VERSION b/VERSION index d6182a8..ea9806d 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -0.3.98-beta +0.3.99-beta diff --git a/public/js/core.js b/public/js/core.js index 029842c..4e8898d 100644 --- a/public/js/core.js +++ b/public/js/core.js @@ -2,7 +2,7 @@ "use strict"; /* version — shown until /api/version resolves (or if the fetch fails, e.g. offline). Kept in sync by hand with the VERSION file at the repo root on every release. */ -const VERSION = "0.3.98-beta"; +const VERSION = "0.3.99-beta"; (function(){ const tag = document.getElementById("verTag"); tag.textContent = "v"+VERSION; diff --git a/src/api.js b/src/api.js index 7e4eff4..eb291fb 100644 --- a/src/api.js +++ b/src/api.js @@ -441,11 +441,15 @@ export default async function api(app) { need(req, reply, PERMISSIONS['users.manage']); // Ouders hebben school_id NULL en vallen daardoor buiten elke schoollijst; // een school ziet wél de ouders die aan haar eigen leerlingen gekoppeld zijn. + // Postgres eist bij SELECT DISTINCT dat elke ORDER BY-expressie letterlijk + // in de select-lijst staat - lower(p.username) alleen via p.* volstond niet + // (gaf "for SELECT DISTINCT, ORDER BY expressions must appear in select + // list"), dus expliciet als extra kolom toevoegen. const linkedParents = async (schoolId, extra = '', params = []) => (await pool.query( - `SELECT DISTINCT p.* FROM users p + `SELECT DISTINCT p.*, lower(p.username) AS sort_key FROM users p JOIN parent_children pc ON pc.parent_id = p.id JOIN users k ON k.id = pc.pupil_id - WHERE k.school_id = $1 ${extra} ORDER BY lower(p.username)`, + WHERE k.school_id = $1 ${extra} ORDER BY sort_key`, [schoolId, ...params])).rows; let rows; if (req.user.allRoles.includes('super')) { diff --git a/test/parent-portal.test.js b/test/parent-portal.test.js index 053beaa..5332404 100644 --- a/test/parent-portal.test.js +++ b/test/parent-portal.test.js @@ -289,7 +289,7 @@ test('afwijzen verwijdert alleen het verzoek; andere school mag niet afhandelen' }); test('schoolbeheerder ziet gekoppelde ouders (met kindernamen) in de gebruikerslijst', async () => { - const { app } = await makeApp({ user: admin, respond: (sql) => { + const { app, calls } = await makeApp({ user: admin, respond: (sql) => { if (sql.startsWith('SELECT * FROM users WHERE school_id')) return { rows: [ { id: 50, username: 'lena', role: 'pupil', school_id: 2, class_id: 5 }, ] }; @@ -306,6 +306,13 @@ test('schoolbeheerder ziet gekoppelde ouders (met kindernamen) in de gebruikersl const p = res.json().users.find((u) => u.role === 'parent'); assert.ok(p, 'ouder hoort in de schoollijst te staan'); assert.deepEqual(p.childNames, ['Lena']); + // regressie: Postgres weigert "SELECT DISTINCT ... ORDER BY lower(p.username)" + // omdat die expressie niet letterlijk in de select-lijst staat (was stuk in + // productie voor elke school-gescopede gebruikerslijst) - de sort-expressie + // moet dus als kolom in de SELECT staan, niet alleen in de ORDER BY. + const linkedParentsCall = calls.find((c) => c.sql.includes('JOIN parent_children pc ON pc.parent_id = p.id')); + assert.match(linkedParentsCall.sql, /SELECT DISTINCT p\.\*, lower\(p\.username\) AS sort_key/); + assert.match(linkedParentsCall.sql, /ORDER BY sort_key/); await app.close(); });