Move constraint priority resolution from JS to server

This commit is contained in:
Ian Gulliver
2026-02-16 10:12:35 -08:00
parent 210f84c002
commit 4c487a251b
2 changed files with 30 additions and 13 deletions

28
main.go
View File

@@ -788,6 +788,14 @@ func handleListConstraints(db *sql.DB) http.HandlerFunc {
Negatives []levelKind `json:"negatives"`
}
var overrides []overrideEntry
type overallEntry struct {
StudentAID int64 `json:"student_a_id"`
StudentBID int64 `json:"student_b_id"`
StudentBName string `json:"student_b_name"`
Kind string `json:"kind"`
Level string `json:"level"`
}
var overalls []overallEntry
if role == "admin" {
type pairKey struct{ a, b int64 }
@@ -798,7 +806,22 @@ func handleListConstraints(db *sql.DB) http.HandlerFunc {
}
isPositive := func(kind string) bool { return kind == "must" || kind == "prefer" }
kindLabel := map[string]string{"must": "Must", "prefer": "Prefer", "prefer_not": "Prefer Not", "must_not": "Must Not"}
levelPriority := map[string]int{"admin": 0, "parent": 1, "student": 2}
for _, idxs := range pairGroups {
bestIdx := idxs[0]
for _, i := range idxs[1:] {
if levelPriority[constraints[i].Level] < levelPriority[constraints[bestIdx].Level] {
bestIdx = i
}
}
overalls = append(overalls, overallEntry{
StudentAID: constraints[bestIdx].StudentAID,
StudentBID: constraints[bestIdx].StudentBID,
StudentBName: constraints[bestIdx].StudentBName,
Kind: constraints[bestIdx].Kind,
Level: constraints[bestIdx].Level,
})
var posIdx, negIdx []int
for _, i := range idxs {
if isPositive(constraints[i].Kind) {
@@ -841,9 +864,12 @@ func handleListConstraints(db *sql.DB) http.HandlerFunc {
if overrides == nil {
overrides = []overrideEntry{}
}
if overalls == nil {
overalls = []overallEntry{}
}
w.Header().Set("Content-Type", "application/json")
json.NewEncoder(w).Encode(map[string]any{"constraints": constraints, "overrides": overrides})
json.NewEncoder(w).Encode(map[string]any{"constraints": constraints, "overrides": overrides, "overalls": overalls})
}
}

View File

@@ -76,18 +76,9 @@ async function loadStudents() {
};
const allOveralls = {};
for (const s of students) {
const myC = constraints.filter(c => c.student_a_id === s.id);
const byPeer = {};
for (const c of myC) {
if (!byPeer[c.student_b_id]) byPeer[c.student_b_id] = {};
byPeer[c.student_b_id][c.level] = c;
}
allOveralls[s.id] = {};
for (const [peerId, levels] of Object.entries(byPeer)) {
const eff = levels.admin || levels.parent || levels.student;
if (eff) allOveralls[s.id][peerId] = eff;
}
for (const s of students) allOveralls[s.id] = {};
for (const o of constraintData.overalls) {
allOveralls[o.student_a_id][o.student_b_id] = o;
}
lastOveralls = allOveralls;