add /blogs/{blogID} and /blogs/lookup/{blogName} routes
This commit is contained in:
parent
dfc116d828
commit
dd72a1f4c1
5 changed files with 104 additions and 1 deletions
|
@ -53,6 +53,8 @@ const (
|
|||
// Controls whether tokens have access to sensitive account data, NOT if they can use `/accounts/@me` endpoints.
|
||||
TokenScopeAccountsMe TokenScope = "accounts.me"
|
||||
TokenScopeAccountsWrite TokenScope = "accounts.write"
|
||||
TokenScopeBlogsRead TokenScope = "blogs.read"
|
||||
TokenScopeBlogsWrite TokenScope = "blogs.write"
|
||||
)
|
||||
|
||||
func (s TokenScope) IsValid() bool {
|
||||
|
|
74
web/api/blogs/get_blog.go
Normal file
74
web/api/blogs/get_blog.go
Normal file
|
@ -0,0 +1,74 @@
|
|||
package blogs
|
||||
|
||||
import (
|
||||
"net/http"
|
||||
|
||||
"git.sleepycat.moe/sam/mercury/internal/database/sql"
|
||||
"git.sleepycat.moe/sam/mercury/web/api"
|
||||
"github.com/go-chi/chi/v5"
|
||||
"github.com/oklog/ulid/v2"
|
||||
"github.com/rs/zerolog/log"
|
||||
)
|
||||
|
||||
func (app *App) GetID(w http.ResponseWriter, r *http.Request) (api.Blog, error) {
|
||||
ctx := r.Context()
|
||||
id, err := ulid.Parse(chi.URLParamFromCtx(ctx, "blogID"))
|
||||
if err != nil {
|
||||
return api.Blog{}, api.Error{Code: api.ErrBlogNotFound}
|
||||
}
|
||||
|
||||
conn, err := app.Database.Acquire(ctx)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("acquiring connection")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
defer conn.Release()
|
||||
|
||||
blog, err := app.Blog(conn).ByID(ctx, id)
|
||||
if err != nil {
|
||||
if err == sql.ErrNotFound {
|
||||
return api.Blog{}, api.Error{Code: api.ErrBlogNotFound}
|
||||
}
|
||||
|
||||
log.Err(err).Str("id", id.String()).Msg("fetching blog from database")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
|
||||
acct, err := app.Account(conn).ByID(ctx, blog.AccountID)
|
||||
if err != nil {
|
||||
log.Err(err).Str("id", blog.AccountID.String()).Msg("fetching account from database")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
|
||||
return api.DBBlogToBlog(blog, acct), nil
|
||||
}
|
||||
|
||||
func (app *App) LookupName(w http.ResponseWriter, r *http.Request) (api.Blog, error) {
|
||||
ctx := r.Context()
|
||||
name := chi.URLParamFromCtx(ctx, "blogName")
|
||||
|
||||
conn, err := app.Database.Acquire(ctx)
|
||||
if err != nil {
|
||||
log.Err(err).Msg("acquiring connection")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
defer conn.Release()
|
||||
|
||||
blog, err := app.Blog(conn).ByName(ctx, name, "")
|
||||
if err != nil {
|
||||
if err == sql.ErrNotFound {
|
||||
return api.Blog{}, api.Error{Code: api.ErrBlogNotFound}
|
||||
}
|
||||
|
||||
log.Err(err).Str("name", name).Msg("fetching blog from database")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
|
||||
acct, err := app.Account(conn).ByID(ctx, blog.AccountID)
|
||||
if err != nil {
|
||||
log.Err(err).Str("id", blog.AccountID.String()).Msg("fetching account from database")
|
||||
return api.Blog{}, err
|
||||
}
|
||||
|
||||
return api.DBBlogToBlog(blog, acct), nil
|
||||
}
|
13
web/api/blogs/module.go
Normal file
13
web/api/blogs/module.go
Normal file
|
@ -0,0 +1,13 @@
|
|||
package blogs
|
||||
|
||||
import "git.sleepycat.moe/sam/mercury/web/app"
|
||||
|
||||
type App struct {
|
||||
*app.App
|
||||
}
|
||||
|
||||
func New(app *app.App) *App {
|
||||
return &App{
|
||||
App: app,
|
||||
}
|
||||
}
|
|
@ -126,7 +126,10 @@ const (
|
|||
ErrMissingScope = 1002
|
||||
|
||||
// Account related
|
||||
ErrAccountNotFound = 1003
|
||||
ErrAccountNotFound = 2001
|
||||
|
||||
// Blog related
|
||||
ErrBlogNotFound = 3001
|
||||
)
|
||||
|
||||
func ErrCodeMessage(code int) string {
|
||||
|
@ -145,6 +148,8 @@ var errCodeMessages = map[int]string{
|
|||
ErrMissingScope: "Token is missing required scope for this endpoint",
|
||||
|
||||
ErrAccountNotFound: "Account not found",
|
||||
|
||||
ErrBlogNotFound: "Blog not found",
|
||||
}
|
||||
|
||||
func ErrCodeStatus(code int) int {
|
||||
|
@ -163,4 +168,6 @@ var errCodeStatuses = map[int]int{
|
|||
ErrMissingScope: http.StatusForbidden,
|
||||
|
||||
ErrAccountNotFound: http.StatusNotFound,
|
||||
|
||||
ErrBlogNotFound: http.StatusNotFound,
|
||||
}
|
||||
|
|
|
@ -4,6 +4,7 @@ import (
|
|||
"git.sleepycat.moe/sam/mercury/internal/database"
|
||||
"git.sleepycat.moe/sam/mercury/web/api"
|
||||
"git.sleepycat.moe/sam/mercury/web/api/accounts"
|
||||
"git.sleepycat.moe/sam/mercury/web/api/blogs"
|
||||
"git.sleepycat.moe/sam/mercury/web/app"
|
||||
"git.sleepycat.moe/sam/mercury/web/auth"
|
||||
"git.sleepycat.moe/sam/mercury/web/frontend"
|
||||
|
@ -43,5 +44,11 @@ func Routes(app *app.App) {
|
|||
Get("/accounts/{accountID}", api.WrapHandlerT(accounts.GetID))
|
||||
r.With(app.APIAuth(database.TokenScopeAccountsMe, false)).
|
||||
Get("/accounts/@me", api.WrapHandlerT(accounts.GetMe))
|
||||
|
||||
blogs := blogs.New(app)
|
||||
r.With(app.APIAuth(database.TokenScopeBlogsRead, true)).
|
||||
Get("/blogs/{blogID}", api.WrapHandlerT(blogs.GetID))
|
||||
r.With(app.APIAuth(database.TokenScopeBlogsRead, true)).
|
||||
Get("/blogs/lookup/{blogName}", api.WrapHandlerT(blogs.LookupName))
|
||||
})
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue