68 lines
1.4 KiB
Go
68 lines
1.4 KiB
Go
package feishu
|
|
|
|
import (
|
|
"encoding/hex"
|
|
"sort"
|
|
"strings"
|
|
)
|
|
|
|
const deleteModeCheckerNamePrefix = "delete_sel_"
|
|
|
|
func deleteModeCheckerName(sessionID string) string {
|
|
return deleteModeCheckerNamePrefix + hex.EncodeToString([]byte(sessionID))
|
|
}
|
|
|
|
func parseDeleteModeCheckerName(name string) (string, bool) {
|
|
if !strings.HasPrefix(name, deleteModeCheckerNamePrefix) {
|
|
return "", false
|
|
}
|
|
raw := strings.TrimPrefix(name, deleteModeCheckerNamePrefix)
|
|
if raw == "" {
|
|
return "", false
|
|
}
|
|
b, err := hex.DecodeString(raw)
|
|
if err != nil {
|
|
return "", false
|
|
}
|
|
return string(b), true
|
|
}
|
|
|
|
func collectDeleteModeSelectedFromFormValue(formValue map[string]any) []string {
|
|
if len(formValue) == 0 {
|
|
return nil
|
|
}
|
|
ids := make([]string, 0, len(formValue))
|
|
seen := make(map[string]struct{}, len(formValue))
|
|
for key, val := range formValue {
|
|
sessionID, ok := parseDeleteModeCheckerName(key)
|
|
if !ok || !isTruthyFormValue(val) {
|
|
continue
|
|
}
|
|
if _, exists := seen[sessionID]; exists {
|
|
continue
|
|
}
|
|
seen[sessionID] = struct{}{}
|
|
ids = append(ids, sessionID)
|
|
}
|
|
sort.Strings(ids)
|
|
return ids
|
|
}
|
|
|
|
func isTruthyFormValue(v any) bool {
|
|
switch x := v.(type) {
|
|
case bool:
|
|
return x
|
|
case string:
|
|
s := strings.ToLower(strings.TrimSpace(x))
|
|
return s == "true" || s == "1" || s == "yes" || s == "on"
|
|
case float64:
|
|
return x != 0
|
|
case int:
|
|
return x != 0
|
|
case int64:
|
|
return x != 0
|
|
default:
|
|
return false
|
|
}
|
|
}
|