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"`
|
Negatives []levelKind `json:"negatives"`
|
||||||
}
|
}
|
||||||
var overrides []overrideEntry
|
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" {
|
if role == "admin" {
|
||||||
type pairKey struct{ a, b int64 }
|
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" }
|
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"}
|
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 {
|
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
|
var posIdx, negIdx []int
|
||||||
for _, i := range idxs {
|
for _, i := range idxs {
|
||||||
if isPositive(constraints[i].Kind) {
|
if isPositive(constraints[i].Kind) {
|
||||||
@@ -841,9 +864,12 @@ func handleListConstraints(db *sql.DB) http.HandlerFunc {
|
|||||||
if overrides == nil {
|
if overrides == nil {
|
||||||
overrides = []overrideEntry{}
|
overrides = []overrideEntry{}
|
||||||
}
|
}
|
||||||
|
if overalls == nil {
|
||||||
|
overalls = []overallEntry{}
|
||||||
|
}
|
||||||
|
|
||||||
w.Header().Set("Content-Type", "application/json")
|
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 = {};
|
const allOveralls = {};
|
||||||
for (const s of students) {
|
for (const s of students) allOveralls[s.id] = {};
|
||||||
const myC = constraints.filter(c => c.student_a_id === s.id);
|
for (const o of constraintData.overalls) {
|
||||||
const byPeer = {};
|
allOveralls[o.student_a_id][o.student_b_id] = o;
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
lastOveralls = allOveralls;
|
lastOveralls = allOveralls;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user