Verbeter anatomie en plaatsing van avataraccessoires (v0.4.46-beta) #1

Open
bes-r wants to merge 192 commits from bes-r/avatar-realism into main AGit
4 changed files with 16 additions and 5 deletions
Showing only changes of commit be8ecc5378 - Show all commits

View file

@ -1 +1 @@
0.3.98-beta 0.3.99-beta

View file

@ -2,7 +2,7 @@
"use strict"; "use strict";
/* version shown until /api/version resolves (or if the fetch fails, e.g. offline). /* 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. */ 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(){ (function(){
const tag = document.getElementById("verTag"); const tag = document.getElementById("verTag");
tag.textContent = "v"+VERSION; tag.textContent = "v"+VERSION;

View file

@ -441,11 +441,15 @@ export default async function api(app) {
need(req, reply, PERMISSIONS['users.manage']); need(req, reply, PERMISSIONS['users.manage']);
// Ouders hebben school_id NULL en vallen daardoor buiten elke schoollijst; // 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. // 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( 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 parent_children pc ON pc.parent_id = p.id
JOIN users k ON k.id = pc.pupil_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; [schoolId, ...params])).rows;
let rows; let rows;
if (req.user.allRoles.includes('super')) { if (req.user.allRoles.includes('super')) {

View file

@ -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 () => { 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: [ if (sql.startsWith('SELECT * FROM users WHERE school_id')) return { rows: [
{ id: 50, username: 'lena', role: 'pupil', school_id: 2, class_id: 5 }, { 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'); const p = res.json().users.find((u) => u.role === 'parent');
assert.ok(p, 'ouder hoort in de schoollijst te staan'); assert.ok(p, 'ouder hoort in de schoollijst te staan');
assert.deepEqual(p.childNames, ['Lena']); 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(); await app.close();
}); });