diff --git a/storage/status.go b/storage/status.go index 28b0f4e..76bde82 100644 --- a/storage/status.go +++ b/storage/status.go @@ -37,7 +37,7 @@ func (s *Storage) populateStatus(rows *sql.Rows) (model.Status, error) { return status, nil } -func (s *Storage) CreatePost(status model.Status) (int64, error) { +func (s *Storage) CreateStatus(status model.Status) (int64, error) { var lid int64 err := s.db.QueryRow(`INSERT INTO statuses (author, content) VALUES ($1, $2) RETURNING id`, status.User, status.Content).Scan(&lid) diff --git a/web/handler/form/editor.go b/web/handler/form/editor.go deleted file mode 100644 index eda9462..0000000 --- a/web/handler/form/editor.go +++ /dev/null @@ -1,34 +0,0 @@ -package form - -import ( - "net/http" -) - -type EditorForm struct { - Name string - Content string -} - -//func (f *HomepageForm) Validate() error { -// if f.Password != f.Confirm { -// return errors.New("password doesn't match confirmation") -// } -// if len(f.Username) < 3 { -// return errors.New("username needs to be at least 3 characters") -// } -// match, _ := regexp.MatchString("^[a-z0-9-_]+$", f.Username) -// if !match { -// return errors.New("only lowercase letters and digits are accepted for username") -// } -// if len(f.Password) < 6 { -// return errors.New("password needs to be at least 6 characters") -// } -// return nil -//} - -func NewEditorForm(r *http.Request) *EditorForm { - return &EditorForm{ - Name: r.FormValue("name"), - Content: r.FormValue("content"), - } -} diff --git a/web/handler/form/folder.go b/web/handler/form/folder.go deleted file mode 100644 index 274d015..0000000 --- a/web/handler/form/folder.go +++ /dev/null @@ -1,15 +0,0 @@ -package form - -import ( - "net/http" -) - -type FolderForm struct { - Name string -} - -func NewFolderForm(r *http.Request) *FolderForm { - return &FolderForm{ - Name: r.FormValue("name"), - } -} diff --git a/web/handler/form/homepage.go b/web/handler/form/register.go similarity index 83% rename from web/handler/form/homepage.go rename to web/handler/form/register.go index 5d79ae3..3e86421 100644 --- a/web/handler/form/homepage.go +++ b/web/handler/form/register.go @@ -6,7 +6,7 @@ import ( "regexp" ) -type HomepageForm struct { +type RegisterForm struct { Username string Password string Confirm string @@ -14,7 +14,7 @@ type HomepageForm struct { Error string } -func (f *HomepageForm) Validate() error { +func (f *RegisterForm) Validate() error { if f.Password != f.Confirm { return errors.New("password doesn't match confirmation") } @@ -31,8 +31,8 @@ func (f *HomepageForm) Validate() error { return nil } -func NewHomepageForm(r *http.Request) *HomepageForm { - return &HomepageForm{ +func NewRegisterForm(r *http.Request) *RegisterForm { + return &RegisterForm{ Username: r.FormValue("name"), Password: r.FormValue("password"), Confirm: r.FormValue("password-confirm"), diff --git a/web/handler/form/status.go b/web/handler/form/status.go new file mode 100644 index 0000000..fb9034c --- /dev/null +++ b/web/handler/form/status.go @@ -0,0 +1,16 @@ +package form + +import ( + "net/http" +) + +type StatusForm struct { + Content string + Error string +} + +func NewStatusForm(r *http.Request) *StatusForm { + return &StatusForm{ + Content: r.FormValue("content"), + } +} diff --git a/web/handler/form/upload.go b/web/handler/form/upload.go deleted file mode 100644 index 401df4d..0000000 --- a/web/handler/form/upload.go +++ /dev/null @@ -1,26 +0,0 @@ -package form - -import ( - "io" - "net/http" -) - -type UploadForm struct { - Filename string - File io.Reader -} - -func NewUploadForm(r *http.Request) (*UploadForm, error) { - if err := r.ParseMultipartForm(2 << 20); err != nil { - return nil, err - } - file, handler, err := r.FormFile("file") - if err != nil { - return nil, err - } - defer file.Close() - return &UploadForm{ - Filename: handler.Filename, - File: file, - }, err -} diff --git a/web/handler/handler.go b/web/handler/handler.go index 07635f7..e678e5a 100644 --- a/web/handler/handler.go +++ b/web/handler/handler.go @@ -46,6 +46,14 @@ type Handler struct { // return user, err //} +func (h *Handler) getUser(r *http.Request) (string, error) { + user, err := h.sess.Get(r) + if err != nil { + return "", err + } + return user, nil +} + func New(cfg *config.Config, sess *session.Session, data *storage.Storage) (http.Handler, error) { router := mux.NewRouter() h := &Handler{ @@ -60,19 +68,11 @@ func New(cfg *config.Config, sess *session.Session, data *storage.Storage) (http router.HandleFunc("/", h.showIndexView).Methods(http.MethodGet) router.HandleFunc("/login", h.showLoginView).Methods(http.MethodGet) router.HandleFunc("/check-login", h.checkLogin).Methods(http.MethodPost) - //router.HandleFunc("/help", h.showHelpView).Methods(http.MethodGet) - //router.HandleFunc("/profile/{username}", h.showProfileView).Methods(http.MethodGet) router.HandleFunc("/register", h.handleRegister) - //router.HandleFunc("/editor", h.handleEditor) - //router.HandleFunc("/upload", h.upload) - //router.HandleFunc("/files", h.handleFiles) - //router.HandleFunc("/new-folder", h.handleNewFolder) - //router.HandleFunc("/new-file", h.handleNewFile) - //router.HandleFunc("/homepages", h.showHomepagesView).Methods(http.MethodGet) - //router.HandleFunc("/rename", h.handleRename) - //router.HandleFunc("/delete", h.handleDelete).Methods(http.MethodPost) router.HandleFunc("/logout", h.logout).Methods(http.MethodGet) - //router.PathPrefix("/").Handler(http.FileServer(http.Dir(cfg.AssetsDir))) + + router.HandleFunc("/statuses/new", h.showNewStatusView).Methods(http.MethodGet) + router.HandleFunc("/statuses/save", h.saveStatus).Methods(http.MethodPost) return router, nil } diff --git a/web/handler/html.go b/web/handler/html.go index 4820b29..371815f 100644 --- a/web/handler/html.go +++ b/web/handler/html.go @@ -3,6 +3,21 @@ package handler var TplMap = map[string]string{ + "create_status": `{{ define "content" }} +

New status

+{{ if .form.Error }} +

{{ .form.Error }}

+{{ end }} +{{ if .flash }} +

{{ .flash }}

+{{ end }} +
+
+ +
+ +
+{{ end }}`, "index": `{{ define "content" }}

This is the index

{{ end }}`, diff --git a/web/handler/html/create_status.html b/web/handler/html/create_status.html new file mode 100644 index 0000000..5348955 --- /dev/null +++ b/web/handler/html/create_status.html @@ -0,0 +1,15 @@ +{{ define "content" }} +

New status

+{{ if .form.Error }} +

{{ .form.Error }}

+{{ end }} +{{ if .flash }} +

{{ .flash }}

+{{ end }} +
+
+ +
+ +
+{{ end }} \ No newline at end of file diff --git a/web/handler/register.go b/web/handler/register.go index 7d270c3..4c5224a 100644 --- a/web/handler/register.go +++ b/web/handler/register.go @@ -82,7 +82,7 @@ func buildIndex(t *template.Template, name string) []byte { func (h *Handler) register(w http.ResponseWriter, r *http.Request) { switch r.Method { case "POST": - f := form.NewHomepageForm(r) + f := form.NewRegisterForm(r) showError := func(err error) { f.Error = err.Error() h.renderLayout(w, "register", map[string]interface{}{"form": *f}, "") diff --git a/web/handler/status_create.go b/web/handler/status_create.go new file mode 100644 index 0000000..3ad1797 --- /dev/null +++ b/web/handler/status_create.go @@ -0,0 +1,24 @@ +package handler + +import "net/http" + +func (h *Handler) showNewStatusView(w http.ResponseWriter, r *http.Request) { + user, err := h.getUser(r) + if err != nil { + unauthorized(w) + return + } + session, err := h.sess.Store.Get(r, "ichi") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + flash := "" + if flashes := session.Flashes(); len(flashes) > 0 { + flash = flashes[0].(string) + } + session.Save(r, w) + h.renderLayout(w, "create_status", map[string]interface{}{ + "flash": flash, + }, user) +} diff --git a/web/handler/status_save.go b/web/handler/status_save.go new file mode 100644 index 0000000..9b05aaa --- /dev/null +++ b/web/handler/status_save.go @@ -0,0 +1,43 @@ +package handler + +import ( + "net/http" + "status/model" + "status/web/handler/form" +) + +func (h *Handler) saveStatus(w http.ResponseWriter, r *http.Request) { + user, err := h.getUser(r) + if err != nil { + unauthorized(w) + return + } + f := form.NewStatusForm(r) + status := model.Status{ + User: user, + Content: f.Content, + } + if err := status.Validate(); err != nil { + f.Error = err.Error() + h.renderLayout(w, "create_status", map[string]interface{}{ + "form": f, + }, "") + return + } + if _, err := h.storage.CreateStatus(status); err != nil { + serverError(w, err) + return + } + session, err := h.sess.Store.Get(r, "ichi") + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + session.AddFlash("Status updated!") + err = session.Save(r, w) + if err != nil { + http.Error(w, err.Error(), http.StatusInternalServerError) + return + } + http.Redirect(w, r, "/statuses/new", http.StatusFound) +}