@ -123,26 +123,88 @@ func (a *api) postToPostTplPayload(storedPost post.StoredPost) (postTplPayload,
return tplPayload , nil
}
func ( a * api ) renderPost Handler( ) http . Handler {
func ( a * api ) getPosts Handler( ) http . Handler {
tpl := a . mustParseBasedTpl ( "post.html" )
renderPostsIndex Handler := a . renderPostsIndex Handler( )
renderEditPostHandler := a . renderEditPostHandler ( false )
tpl := a . mustParseBasedTpl ( "posts .html" )
getPost Handler := a . getPost Handler( )
const pageCount = 20
return http . HandlerFunc ( func ( rw http . ResponseWriter , r * http . Request ) {
id := strings . TrimSuffix ( filepath . Base ( r . URL . Path ) , ".html" )
id := filepath . Base ( r . URL . Path )
if id = = "/" {
renderPostsIndex Handler. ServeHTTP ( rw , r )
if id ! = "/" {
getPost Handler. ServeHTTP ( rw , r )
return
}
if _ , ok := r . URL . Query ( ) [ "edit" ] ; ok {
renderEditPostHandler . ServeHTTP ( rw , r )
page , err := apiutil . StrToInt ( r . FormValue ( "p" ) , 0 )
if err != nil {
apiutil . BadRequest (
rw , r , fmt . Errorf ( "invalid page number: %w" , err ) ,
)
return
}
tag := r . FormValue ( "tag" )
var (
posts [ ] post . StoredPost
hasMore bool
)
if tag == "" {
posts , hasMore , err = a . params . PostStore . Get ( page , pageCount )
} else {
posts , err = a . params . PostStore . GetByTag ( tag )
}
if err != nil {
apiutil . InternalServerError (
rw , r , fmt . Errorf ( "fetching page %d of posts: %w" , page , err ) ,
)
return
}
tags , err := a . params . PostStore . GetTags ( )
if err != nil {
apiutil . InternalServerError (
rw , r , fmt . Errorf ( "fething tags: %w" , err ) ,
)
return
}
tplPayload := struct {
Posts [ ] post . StoredPost
PrevPage , NextPage int
Tags [ ] string
} {
Posts : posts ,
PrevPage : - 1 ,
NextPage : - 1 ,
Tags : tags ,
}
if page > 0 {
tplPayload . PrevPage = page - 1
}
if hasMore {
tplPayload . NextPage = page + 1
}
executeTemplate ( rw , r , tpl , tplPayload )
} )
}
func ( a * api ) getPostHandler ( ) http . Handler {
tpl := a . mustParseBasedTpl ( "post.html" )
return http . HandlerFunc ( func ( rw http . ResponseWriter , r * http . Request ) {
id := strings . TrimSuffix ( filepath . Base ( r . URL . Path ) , ".html" )
storedPost , err := a . params . PostStore . GetByID ( id )
if errors . Is ( err , post . ErrPostNotFound ) {
@ -171,19 +233,13 @@ func (a *api) renderPostHandler() http.Handler {
} )
}
func ( a * api ) renderPostsIndex Handler( ) http . Handler {
func ( a * api ) managePosts Handler( ) http . Handler {
renderEditPostHandler := a . renderEditPostHandler ( false )
tpl := a . mustParseBasedTpl ( "posts.html" )
tpl := a . mustParseBasedTpl ( "posts-manage.html" )
const pageCount = 20
return http . HandlerFunc ( func ( rw http . ResponseWriter , r * http . Request ) {
if _ , ok := r . URL . Query ( ) [ "edit" ] ; ok {
renderEditPostHandler . ServeHTTP ( rw , r )
return
}
page , err := apiutil . StrToInt ( r . FormValue ( "p" ) , 0 )
if err != nil {
apiutil . BadRequest (
@ -221,20 +277,26 @@ func (a *api) renderPostsIndexHandler() http.Handler {
} )
}
func ( a * api ) r enderE ditPostHandler( isDraft bool ) http . Handler {
func ( a * api ) editPostHandler ( isDraft bool ) http . Handler {
tpl := a . mustParseBasedTpl ( "edit- post.html" )
tpl := a . mustParseBasedTpl ( "post-edi t.html" )
return http . HandlerFunc ( func ( rw http . ResponseWriter , r * http . Request ) {
id := filepath . Base ( r . URL . Path )
var storedPost post . StoredPost
if id == "/" && ! isDraft {
http . Error ( rw , "Post id required" , 400 )
return
}
var (
storedPost post . StoredPost
err error
)
if id != "/" {
var err error
if isDraft {
storedPost . Post , err = a . params . PostDraftStore . GetByID ( id )
} else {
@ -250,10 +312,6 @@ func (a *api) renderEditPostHandler(isDraft bool) http.Handler {
)
return
}
} else if ! isDraft {
http . Error ( rw , "Post ID required in URL" , 400 )
return
}
tags , err := a . params . PostStore . GetTags ( )
@ -348,7 +406,7 @@ func (a *api) postPostHandler() http.Handler {
return
}
a . executeRedirectTpl ( rw , r , a . p ostURL( p . ID , false ) )
a . executeRedirectTpl ( rw , r , a . editP ostURL( p . ID , false ) )
} )
}
@ -382,9 +440,9 @@ func (a *api) deletePostHandler(isDraft bool) http.Handler {
}
if isDraft {
a . executeRedirectTpl ( rw , r , a . draf tsURL( false ) )
a . executeRedirectTpl ( rw , r , a . manageDraftPos tsURL( false ) )
} else {
a . executeRedirectTpl ( rw , r , a . p ostsURL( false ) )
a . executeRedirectTpl ( rw , r , a . manageP ostsURL( false ) )
}
} )
}