adding admin listing of accounts

This commit is contained in:
Roland Osborne 2022-03-09 21:19:05 -08:00
parent 9af758a82b
commit 3a0409c002
5 changed files with 147 additions and 20 deletions

View File

@ -130,7 +130,7 @@ paths:
schema: schema:
type: array type: array
items: items:
$ref: '#/components/schemas/Account' $ref: '#/components/schemas/AccountProfile'
'401': '401':
description: invalid password description: invalid password
'404': '404':
@ -156,6 +156,36 @@ paths:
'500': '500':
description: internal server error description: internal server error
/admin/accounts/{accountId}/image:
get:
tags:
- admin
description: Get profile image of node account.
operationId: get-node-account-image
security:
- basicAuth: []
parameters:
- name: accountId
in: path
description: id of account to delete
required: true
schema:
type: string
responses:
'200':
description: successful operation
content:
application/octet-stream: # content specific
schema:
type: string
format: binary
'401':
description: invalid authentication
'404':
description: account not found
'500':
description: internal server error
/admin/accounts/{accountId}/reset: /admin/accounts/{accountId}/reset:
put: put:
tags: tags:
@ -3006,13 +3036,23 @@ components:
type: object type: object
required: required:
- accountId - accountId
- profile
- disabled - disabled
properties: properties:
accountId: accountId:
type: integer
format: uint32
guid:
type: string type: string
profile: handle:
$ref: '#/components/schemas/Profile' type: string
name:
type: string
description:
type: string
location:
type: string
imageSet:
type: boolean
disabled: disabled:
type: boolean type: boolean

View File

@ -13,16 +13,6 @@ import (
"net/http" "net/http"
) )
func GetNodeAccountImage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func GetNodeAccounts(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func ImportAccount(w http.ResponseWriter, r *http.Request) { func ImportAccount(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)

View File

@ -0,0 +1,54 @@
package databag
import (
"time"
"strconv"
"gorm.io/gorm"
"bytes"
"errors"
"encoding/base64"
"net/http"
"databag/internal/store"
"github.com/gorilla/mux"
)
func GetNodeAccountImage(w http.ResponseWriter, r *http.Request) {
// get referenced account id
params := mux.Vars(r)
accountId, res := strconv.ParseUint(params["accountId"], 10, 32)
if res != nil {
ErrResponse(w, http.StatusBadRequest, res)
return
}
if err := AdminLogin(r); err != nil {
ErrResponse(w, http.StatusUnauthorized, err)
return
}
var account store.Account
if err := store.DB.Preload("AccountDetail").First(&account, uint(accountId)).Error; err != nil {
if errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusNotFound, err)
} else {
ErrResponse(w, http.StatusInternalServerError, err)
}
return
}
if account.AccountDetail.Image == "" {
ErrResponse(w, http.StatusNotFound, errors.New("iamge not set"))
return
}
data, err := base64.StdEncoding.DecodeString(account.AccountDetail.Image)
if err != nil {
ErrResponse(w, http.StatusNotFound, errors.New("image not valid"))
return
}
// response with content
http.ServeContent(w, r, "image", time.Unix(account.Updated, 0), bytes.NewReader(data))
}

View File

@ -0,0 +1,37 @@
package databag
import (
"net/http"
"databag/internal/store"
)
func GetNodeAccounts(w http.ResponseWriter, r *http.Request) {
if err := AdminLogin(r); err != nil {
ErrResponse(w, http.StatusUnauthorized, err)
return
}
var accounts []store.Account
if err := store.DB.Preload("AccountDetail").Find(&accounts).Error; err != nil {
ErrResponse(w, http.StatusInternalServerError, err)
return
}
profiles := []AccountProfile{}
for _, account := range accounts {
profiles = append(profiles, AccountProfile{
AccountId: uint32(account.ID),
Guid: account.Guid,
Handle: account.Username,
Name: account.AccountDetail.Name,
Description: account.AccountDetail.Description,
Location: account.AccountDetail.Location,
ImageSet: account.AccountDetail.Image != "",
Disabled: account.Disabled,
})
}
WriteResponse(w, &profiles);
}

View File

@ -1,14 +1,20 @@
package databag package databag
import ( type AccountProfile struct {
//"os"
)
type Account struct { AccountId uint32 `json:"accountId"`
AccountId string `json:"accountId"` Guid string `json:"guid"`
Profile *Profile `json:"profile"` Handle string `json:"handle,omitempty"`
Name string `json:"name,omitempty"`
Description string `json:"description,omitempty"`
Location string `json:"location,omitempty"`
ImageSet bool `json:"imageSet,omitempty"`
Disabled bool `json:"disabled"` Disabled bool `json:"disabled"`
} }