Move constraint priority resolution from JS to server
This commit is contained in:
28
main.go
28
main.go
@@ -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})
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user