Loggest thine Stuff
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

104 lines
2.4 KiB

package httpapi
import (
"git.aiterp.net/stufflog3/stufflog3/entities"
"git.aiterp.net/stufflog3/stufflog3/models"
"git.aiterp.net/stufflog3/stufflog3/usecases/scopes"
"github.com/gin-gonic/gin"
"net/http"
)
type scopeResult struct {
entities.Scope
Members []scopeResultMember `json:"members"`
}
type scopeResultMember struct {
ID string `json:"id"`
Name string `json:"name"`
Owner bool `json:"owner"`
}
func ScopeMiddleware(scopes *scopes.Service) gin.HandlerFunc {
return func(c *gin.Context) {
id, err := reqInt(c, "scope_id")
if err != nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, Error{
Code: http.StatusBadRequest,
Message: "Invalid scope ID in path!",
Data: models.BadInputError{
Object: "params",
Field: "scopeid",
Problem: "Not a number",
},
})
}
scope, _, err := scopes.Find(c.Request.Context(), id)
if err != nil {
c.AbortWithStatusJSON(http.StatusUnauthorized, Error{
Code: http.StatusNotFound,
Message: "Scope not found or inaccessible",
})
}
c.Request = c.Request.WithContext(scopes.ContextWithScope(c.Request.Context(), *scope))
}
}
func Scopes(g *gin.RouterGroup, scopes *scopes.Service) {
g.GET("", handler("scopes", func(c *gin.Context) (interface{}, error) {
scopes, members, err := scopes.List(c.Request.Context())
if err != nil {
return nil, err
}
results := make([]scopeResult, 0, len(scopes))
for _, scope := range scopes {
resMembers := make([]scopeResultMember, 0, len(members)/2)
for _, member := range members {
if member.ScopeID == scope.ID {
resMembers = append(resMembers, scopeResultMember{
ID: member.UserID,
Name: member.Name,
Owner: member.Owner,
})
}
}
results = append(results, scopeResult{
Scope: scope,
Members: resMembers,
})
}
return results, nil
}))
g.GET("/:scope_id", handler("scope", func(c *gin.Context) (interface{}, error) {
id, err := reqInt(c, "scope_id")
if err != nil {
return nil, err
}
scope, members, err := scopes.Find(c.Request.Context(), id)
if err != nil {
return nil, err
}
resMembers := make([]scopeResultMember, 0, len(members)/2)
for _, member := range members {
resMembers = append(resMembers, scopeResultMember{
ID: member.UserID,
Name: member.Name,
Owner: member.Owner,
})
}
return scopeResult{
Scope: *scope,
Members: resMembers,
}, nil
}))
}