feat: add public account overview visibility
This commit is contained in:
+104
-32
@@ -43,6 +43,14 @@ func (a *App) api(w http.ResponseWriter, r *http.Request) {
|
||||
a.login(w, r)
|
||||
return
|
||||
}
|
||||
if p == "accounts" && readOnlyMethod(r.Method) {
|
||||
a.accountsAPI(w, r)
|
||||
return
|
||||
}
|
||||
if p == "dashboard" && readOnlyMethod(r.Method) {
|
||||
a.dashboardAPI(w, r)
|
||||
return
|
||||
}
|
||||
if !a.require(w, r) {
|
||||
return
|
||||
}
|
||||
@@ -53,17 +61,11 @@ func (a *App) api(w http.ResponseWriter, r *http.Request) {
|
||||
jsonOut(w, 200, map[string]string{"username": username})
|
||||
case p == "auth/logout" && r.Method == "POST":
|
||||
a.logout(w, r)
|
||||
case p == "accounts" && r.Method == "GET":
|
||||
x, e := a.store.Accounts()
|
||||
if e != nil {
|
||||
jsonOut(w, 500, map[string]string{"error": e.Error()})
|
||||
} else {
|
||||
jsonOut(w, 200, x)
|
||||
}
|
||||
case p == "accounts" && r.Method == "POST":
|
||||
var in struct {
|
||||
DisplayName string `json:"displayName"`
|
||||
ExpectedKind string `json:"expectedKind"`
|
||||
DisplayName string `json:"displayName"`
|
||||
ExpectedKind string `json:"expectedKind"`
|
||||
PublicVisible bool `json:"publicVisible"`
|
||||
}
|
||||
if decode(r, &in) != nil {
|
||||
jsonOut(w, 400, map[string]string{"error": "请求格式错误"})
|
||||
@@ -80,7 +82,7 @@ func (a *App) api(w http.ResponseWriter, r *http.Request) {
|
||||
jsonOut(w, 400, map[string]string{"error": "连接类型无效"})
|
||||
break
|
||||
}
|
||||
x, e := a.store.CreateAccount(in.DisplayName, in.ExpectedKind)
|
||||
x, e := a.store.CreateAccountWithVisibility(in.DisplayName, in.ExpectedKind, in.PublicVisible)
|
||||
if e == nil {
|
||||
a.addRuntime(x.ID)
|
||||
jsonOut(w, 201, x)
|
||||
@@ -90,25 +92,7 @@ func (a *App) api(w http.ResponseWriter, r *http.Request) {
|
||||
case strings.HasPrefix(p, "accounts/"):
|
||||
a.accountAPI(w, r, p)
|
||||
case p == "dashboard":
|
||||
id, _ := strconv.ParseInt(r.URL.Query().Get("accountId"), 10, 64)
|
||||
if id == 0 {
|
||||
id = 1
|
||||
}
|
||||
rt := a.runtime(id)
|
||||
if rt == nil {
|
||||
jsonOut(w, 404, map[string]string{"error": "账号不存在"})
|
||||
} else {
|
||||
rt.syncing.Lock()
|
||||
d := rt.dash
|
||||
rt.syncing.Unlock()
|
||||
if d.Limits == nil {
|
||||
d.Limits = []LimitBucket{}
|
||||
}
|
||||
if d.Usage == nil {
|
||||
d.Usage = []UsagePoint{}
|
||||
}
|
||||
jsonOut(w, 200, d)
|
||||
}
|
||||
a.dashboardAPI(w, r)
|
||||
case p == "sync" && r.Method == "POST":
|
||||
id, _ := strconv.ParseInt(r.URL.Query().Get("accountId"), 10, 64)
|
||||
if id == 0 {
|
||||
@@ -162,6 +146,93 @@ func (a *App) api(w http.ResponseWriter, r *http.Request) {
|
||||
}
|
||||
}
|
||||
|
||||
func readOnlyMethod(method string) bool {
|
||||
return method == http.MethodGet || method == http.MethodHead
|
||||
}
|
||||
|
||||
func (a *App) accountsAPI(w http.ResponseWriter, r *http.Request) {
|
||||
if !a.store.Initialized() {
|
||||
jsonOut(w, http.StatusConflict, map[string]string{"error": "请先初始化"})
|
||||
return
|
||||
}
|
||||
x, e := a.store.Accounts()
|
||||
if e != nil {
|
||||
jsonOut(w, http.StatusInternalServerError, map[string]string{"error": e.Error()})
|
||||
return
|
||||
}
|
||||
if !a.authed(r) {
|
||||
visible := make([]store.Account, 0, len(x))
|
||||
for _, account := range x {
|
||||
if !account.PublicVisible {
|
||||
continue
|
||||
}
|
||||
visible = append(visible, publicAccount(account))
|
||||
}
|
||||
x = visible
|
||||
}
|
||||
jsonOut(w, http.StatusOK, x)
|
||||
}
|
||||
|
||||
func publicAccount(account store.Account) store.Account {
|
||||
account.Email = nil
|
||||
account.ExpectedKind = "any"
|
||||
account.ActualKind = "unknown"
|
||||
account.ValidationStatus = "unknown"
|
||||
account.PossibleDuplicate = false
|
||||
account.CreatedAt = 0
|
||||
account.UpdatedAt = 0
|
||||
return account
|
||||
}
|
||||
|
||||
func (a *App) dashboardAPI(w http.ResponseWriter, r *http.Request) {
|
||||
if !a.store.Initialized() {
|
||||
jsonOut(w, http.StatusConflict, map[string]string{"error": "请先初始化"})
|
||||
return
|
||||
}
|
||||
id, _ := strconv.ParseInt(r.URL.Query().Get("accountId"), 10, 64)
|
||||
if id == 0 {
|
||||
id = 1
|
||||
}
|
||||
account, accountErr := a.store.Account(id)
|
||||
if accountErr != nil {
|
||||
if accountErr == sql.ErrNoRows {
|
||||
jsonOut(w, http.StatusNotFound, map[string]string{"error": "账号不存在"})
|
||||
} else {
|
||||
jsonOut(w, http.StatusInternalServerError, map[string]string{"error": accountErr.Error()})
|
||||
}
|
||||
return
|
||||
}
|
||||
if !a.authed(r) && !account.PublicVisible {
|
||||
jsonOut(w, http.StatusNotFound, map[string]string{"error": "账号不存在"})
|
||||
return
|
||||
}
|
||||
rt := a.runtime(id)
|
||||
if rt == nil {
|
||||
jsonOut(w, http.StatusNotFound, map[string]string{"error": "账号不存在"})
|
||||
return
|
||||
}
|
||||
rt.syncing.Lock()
|
||||
d := rt.dash
|
||||
rt.syncing.Unlock()
|
||||
if d.Limits == nil {
|
||||
d.Limits = []LimitBucket{}
|
||||
}
|
||||
if d.Usage == nil {
|
||||
d.Usage = []UsagePoint{}
|
||||
}
|
||||
if !a.authed(r) {
|
||||
d = publicDashboard(d)
|
||||
}
|
||||
jsonOut(w, http.StatusOK, d)
|
||||
}
|
||||
|
||||
func publicDashboard(d Dashboard) Dashboard {
|
||||
d.Account.Email = nil
|
||||
d.Account.AuthMode = nil
|
||||
d.LastError = ""
|
||||
return d
|
||||
}
|
||||
|
||||
func (a *App) accountAPI(w http.ResponseWriter, r *http.Request, p string) {
|
||||
parts := strings.Split(p, "/")
|
||||
if len(parts) < 2 {
|
||||
@@ -185,8 +256,9 @@ func (a *App) accountAPI(w http.ResponseWriter, r *http.Request, p string) {
|
||||
switch {
|
||||
case action == "" && r.Method == "PUT":
|
||||
var in struct {
|
||||
DisplayName string `json:"displayName"`
|
||||
ExpectedKind string `json:"expectedKind"`
|
||||
DisplayName string `json:"displayName"`
|
||||
ExpectedKind string `json:"expectedKind"`
|
||||
PublicVisible *bool `json:"publicVisible"`
|
||||
}
|
||||
if decode(r, &in) != nil || strings.TrimSpace(in.DisplayName) == "" {
|
||||
jsonOut(w, 400, map[string]string{"error": "名称不能为空"})
|
||||
@@ -205,7 +277,7 @@ func (a *App) accountAPI(w http.ResponseWriter, r *http.Request, p string) {
|
||||
jsonOut(w, 400, map[string]string{"error": "连接类型无效"})
|
||||
return
|
||||
}
|
||||
e = a.store.UpdateAccountSettings(id, strings.TrimSpace(in.DisplayName), in.ExpectedKind)
|
||||
e = a.store.UpdateAccountSettingsWithVisibility(id, strings.TrimSpace(in.DisplayName), in.ExpectedKind, in.PublicVisible)
|
||||
if e == nil {
|
||||
jsonOut(w, 200, map[string]bool{"ok": true})
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user