4f2dc018da
deliberately skipping salting and encrypting passwords at this point. intending to approach this in tandem with authenication. also starting to want db migrations, but trying not to get distracted.
151 lines
3.7 KiB
Go
151 lines
3.7 KiB
Go
package main
|
|
|
|
import (
|
|
"errors"
|
|
"fmt"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"github.com/julienschmidt/httprouter"
|
|
"snippetbox.chaosfem.tw/internal/models"
|
|
"snippetbox.chaosfem.tw/internal/validator"
|
|
)
|
|
|
|
// home ...
|
|
func (app *application) home(w http.ResponseWriter, r *http.Request) {
|
|
snippets, err := app.snippets.Latest()
|
|
if err != nil {
|
|
app.serverError(w, r, err)
|
|
return
|
|
}
|
|
|
|
data := app.newTemplateData(r)
|
|
data.Snippets = snippets
|
|
|
|
app.render(w, r, http.StatusOK, "home.tmpl", data)
|
|
}
|
|
|
|
// snippetView ...
|
|
func (app *application) snippetView(w http.ResponseWriter, r *http.Request) {
|
|
params := httprouter.ParamsFromContext(r.Context())
|
|
|
|
id, err := strconv.Atoi(params.ByName("id"))
|
|
if err != nil || id < 1 {
|
|
app.notFound(w)
|
|
return
|
|
}
|
|
|
|
snippet, err := app.snippets.Get(id)
|
|
if err != nil || id < 1 {
|
|
if errors.Is(err, models.ErrNoRecord) {
|
|
app.notFound(w)
|
|
} else {
|
|
app.serverError(w, r, err)
|
|
}
|
|
return
|
|
}
|
|
|
|
data := app.newTemplateData(r)
|
|
data.Snippet = snippet
|
|
|
|
app.render(w, r, http.StatusOK, "view.tmpl", data)
|
|
}
|
|
|
|
// (app *application) snippetCreate ...
|
|
func (app *application) snippetCreate(w http.ResponseWriter, r *http.Request) {
|
|
data := app.newTemplateData(r)
|
|
|
|
data.Form = snippetCreateForm{
|
|
Expires: 365,
|
|
}
|
|
|
|
app.render(w, r, http.StatusOK, "create.tmpl", data)
|
|
}
|
|
|
|
type snippetCreateForm struct {
|
|
Title string `form:"title"`
|
|
Content string `form:"content"`
|
|
Expires int `form:"expires"`
|
|
validator.Validator `form:"-"`
|
|
}
|
|
|
|
// snippetCreatePost ...
|
|
func (app *application) snippetCreatePost(w http.ResponseWriter, r *http.Request) {
|
|
var form snippetCreateForm
|
|
|
|
err := app.decodePostForm(r, &form)
|
|
if err != nil {
|
|
app.clientError(w, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
form.CheckField(validator.NotBlank(form.Title), "title", "This field cannot be blank")
|
|
form.CheckField(validator.MaxChars(form.Title, 100), "title", "This field cannot be more than 100 characters long")
|
|
form.CheckField(validator.NotBlank(form.Content), "content", "This field cannot be blank")
|
|
form.CheckField(validator.PermittedValue(form.Expires, 1, 7, 365), "expires", "This field must equal 1, 7 or 365")
|
|
|
|
if !form.Valid() {
|
|
data := app.newTemplateData(r)
|
|
data.Form = form
|
|
app.render(w, r, http.StatusUnprocessableEntity, "create.tmpl", data)
|
|
return
|
|
}
|
|
|
|
id, err := app.snippets.Insert(form.Title, form.Content, form.Expires)
|
|
if err != nil {
|
|
app.serverError(w, r, err)
|
|
return
|
|
}
|
|
|
|
app.sessionManager.Put(r.Context(), "flash", "Snippet successfully created!")
|
|
|
|
http.Redirect(w, r, fmt.Sprintf("/snippet/view/%d", id), http.StatusSeeOther)
|
|
}
|
|
|
|
type userSignupForm struct {
|
|
Username string `form:"username"`
|
|
Password string `form:"password"`
|
|
validator.Validator `form:"-"`
|
|
}
|
|
|
|
// userSignup ...
|
|
func (app *application) userSignup(w http.ResponseWriter, r *http.Request) {
|
|
data := app.newTemplateData(r)
|
|
|
|
data.Form = userSignupForm{}
|
|
|
|
app.render(w, r, http.StatusOK, "signup.tmpl", data)
|
|
}
|
|
|
|
|
|
// userSignup ...
|
|
func (app *application) userSignupPost(w http.ResponseWriter, r *http.Request) {
|
|
var form userSignupForm
|
|
|
|
err := app.decodePostForm(r, &form)
|
|
if err != nil {
|
|
app.clientError(w, http.StatusBadRequest)
|
|
return
|
|
}
|
|
|
|
form.CheckField(validator.NotBlank(form.Username), "username", "This field cannot be blank")
|
|
form.CheckField(validator.NotBlank(form.Password), "password", "This field cannot be blank")
|
|
|
|
if !form.Valid() {
|
|
data := app.newTemplateData(r)
|
|
data.Form = form
|
|
app.render(w, r, http.StatusUnprocessableEntity, "signup.tmpl", data)
|
|
return
|
|
}
|
|
|
|
id, err := app.users.Insert(form.Username, form.Password)
|
|
if err != nil {
|
|
app.serverError(w, r, err)
|
|
return
|
|
}
|
|
|
|
app.sessionManager.Put(r.Context(), "flash", fmt.Sprintf("CREATED A USER! (%d)", id))
|
|
|
|
http.Redirect(w, r, "/", http.StatusSeeOther)
|
|
}
|