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…
	
	Add table
		Add a link
		
	
		Reference in a new issue