diff --git a/storage/status.go b/storage/status.go index 97ad237..c9c35f4 100644 --- a/storage/status.go +++ b/storage/status.go @@ -31,7 +31,14 @@ func (p statusQueryBuilder) build() string { func (s *Storage) populateStatus(rows *sql.Rows) (model.Status, error) { var status model.Status - err := rows.Scan(&status.Id, &status.User, &status.Content, &status.CreatedAt, &status.Face, &status.Number) + err := rows.Scan( + &status.Id, + &status.User, + &status.Content, + &status.CreatedAt, + &status.Face, + &status.Number, + ) if err != nil { return status, err } @@ -45,30 +52,39 @@ func (s *Storage) CreateStatus(status model.Status) error { if err != nil { return err } - if err := tx.QueryRowContext(ctx, `INSERT INTO statuses (author, content, face, number) VALUES ($1, $2, $3, $4) RETURNING id`, - status.User, status.Content, status.Face, status.Number).Scan(&statusId); err != nil { + + if err := tx.QueryRowContext(ctx, + `INSERT INTO statuses (author, content, face, number) + VALUES ($1, $2, $3, $4) RETURNING id`, + status.User, status.Content, status.Face, status.Number, + ).Scan(&statusId); err != nil { tx.Rollback() return err } - if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, statusId, status.User); err != nil { + if _, err := tx.ExecContext(ctx, + `UPDATE users SET status_id = $1 WHERE name = $2`, + statusId, status.User, + ); err != nil { tx.Rollback() return err } - err = tx.Commit() - return err + + return tx.Commit() } func (s *Storage) StatusById(id int64) (model.Status, error) { var status model.Status err := s.db.QueryRow( - `SELECT id, author, content, face, created_at, number from statuses WHERE id=$1`, id).Scan( + `SELECT id, author, content, face, created_at, number + FROM statuses WHERE id=$1`, id, + ).Scan( &status.Id, &status.User, &status.Content, &status.Face, &status.CreatedAt, - &status.Number, + &status.Number, ) return status, err } @@ -82,6 +98,7 @@ func (s *Storage) StatusByUsername(user string, perPage int, page int64) ([]mode if err != nil { return nil, false, err } + var statuses []model.Status for rows.Next() { post, err := s.populateStatus(rows) @@ -90,10 +107,12 @@ func (s *Storage) StatusByUsername(user string, perPage int, page int64) ([]mode } statuses = append(statuses, post) } + if len(statuses) > perPage { - return statuses[0:perPage], true, err + return statuses[:perPage], true, nil } - return statuses, false, err + + return statuses, false, nil } func (s *Storage) StatusFeed() ([]model.Status, error) { @@ -103,6 +122,7 @@ func (s *Storage) StatusFeed() ([]model.Status, error) { if err != nil { return nil, err } + var statuses []model.Status for rows.Next() { post, err := s.populateStatus(rows) @@ -111,7 +131,8 @@ func (s *Storage) StatusFeed() ([]model.Status, error) { } statuses = append(statuses, post) } - return statuses, err + + return statuses, nil } func (s *Storage) Statuses(page int64, perPage int) ([]model.Status, bool, error) { @@ -122,38 +143,41 @@ func (s *Storage) Statuses(page int64, perPage int) ([]model.Status, bool, error if err != nil { return nil, false, err } + var statuses []model.Status for rows.Next() { post, err := s.populateStatus(rows) if err != nil { - return statuses, false, err + return nil, false, err } statuses = append(statuses, post) } + if len(statuses) > perPage { - return statuses[0:perPage], true, err + return statuses[:perPage], true, nil } - return statuses, false, err + + return statuses, false, nil } func (s *Storage) LatestStatuses() ([]model.Status, error) { rows, err := s.db.Query(` - select + SELECT statuses.id, users.name, statuses.content, statuses.created_at, statuses.face, - statuses.number - from - users - inner join statuses - on users.status_id = statuses.id - order by statuses.created_at desc; + statuses.number + FROM users + INNER JOIN statuses + ON users.status_id = statuses.id + ORDER BY statuses.created_at DESC; `) if err != nil { return nil, err } + var statuses []model.Status for rows.Next() { post, err := s.populateStatus(rows) @@ -162,15 +186,29 @@ func (s *Storage) LatestStatuses() ([]model.Status, error) { } statuses = append(statuses, post) } - return statuses, err + + return statuses, nil } func (s *Storage) UpdateStatus(status model.Status) error { - stmt, err := s.db.Prepare(`UPDATE statuses SET content = $1, face = $2, number = $3 WHERE id = $4 and author = $5;`) + stmt, err := s.db.Prepare(` + UPDATE statuses + SET content = $1, face = $2, number = $3 + WHERE id = $4 AND author = $5; + `) if err != nil { return err } - _, err = stmt.Exec(status.Content, status.Face, status.Id, status.User, status.Number) + + + _, err = stmt.Exec( + status.Content, + status.Face, + status.Number, + status.Id, + status.User, + ) + return err } @@ -180,42 +218,72 @@ func (s *Storage) DeleteStatus(id int64, author string) error { if err != nil { return err } + var latestId int64 - if err := tx.QueryRowContext(ctx, `select status_id from users where name = $1`, - author).Scan(&latestId); err != nil { + if err := tx.QueryRowContext(ctx, + `SELECT status_id FROM users WHERE name = $1`, + author, + ).Scan(&latestId); err != nil { tx.Rollback() return err } - if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, nil, author); err != nil { + + if _, err := tx.ExecContext(ctx, + `UPDATE users SET status_id = $1 WHERE name = $2`, + nil, author, + ); err != nil { tx.Rollback() return err } - if _, err := tx.ExecContext(ctx, `DELETE from statuses WHERE id = $1 and author = $2;`, id, author); err != nil { + + if _, err := tx.ExecContext(ctx, + `DELETE FROM statuses WHERE id = $1 AND author = $2`, + id, author, + ); err != nil { tx.Rollback() return err } + if latestId == id { var newId int64 - if err := tx.QueryRowContext(ctx, `select id from statuses where author = $1 order by created_at desc limit 1;`, - author).Scan(&newId); err != nil { - if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, nil, author); err != nil { + err := tx.QueryRowContext(ctx, + `SELECT id FROM statuses + WHERE author = $1 + ORDER BY created_at DESC + LIMIT 1`, + author, + ).Scan(&newId) + + if err == sql.ErrNoRows { + _, err = tx.ExecContext(ctx, + `UPDATE users SET status_id = NULL WHERE name = $1`, + author) + if err != nil { tx.Rollback() return err } - err = tx.Commit() - return err - } - if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, newId, author); err != nil { + } else if err == nil { + _, err = tx.ExecContext(ctx, + `UPDATE users SET status_id = $1 WHERE name = $2`, + newId, author) + if err != nil { + tx.Rollback() + return err + } + } else { tx.Rollback() return err } } else { - if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, latestId, author); err != nil { + _, err := tx.ExecContext(ctx, + `UPDATE users SET status_id = $1 WHERE name = $2`, + latestId, author) + + if err != nil { tx.Rollback() return err } } - err = tx.Commit() - return err + return tx.Commit() } diff --git a/web/handler/common.go b/web/handler/common.go index b8415ef..3a2881d 100644 --- a/web/handler/common.go +++ b/web/handler/common.go @@ -37,6 +37,7 @@ var TplCommonMap = map[string]string{ {{ template "content" . }} diff --git a/web/handler/html/common/layout.html b/web/handler/html/common/layout.html index 4b3502f..ee4963d 100644 --- a/web/handler/html/common/layout.html +++ b/web/handler/html/common/layout.html @@ -27,6 +27,7 @@ {{ template "content" . }} diff --git a/web/handler/index_show.go b/web/handler/index_show.go index 0fcb37f..705e5cf 100644 --- a/web/handler/index_show.go +++ b/web/handler/index_show.go @@ -14,7 +14,7 @@ type Update struct { func (h *Handler) showIndexView(w http.ResponseWriter, r *http.Request) { protectClickJacking(w) user, _ := h.sess.Get(r) - statuses, err := h.storage.LatestStatuses() + statuses, err := h.storage.StatusFeed() if err != nil { serverError(w, err) return diff --git a/web/handler/widget_show.go b/web/handler/widget_show.go index da381c0..5b0d070 100644 --- a/web/handler/widget_show.go +++ b/web/handler/widget_show.go @@ -33,7 +33,7 @@ fetch("https://sillywordz.kissing.computer/users/` + escName + `/status.json") "I wrote " + r.number + " words on my project!"; if (r.content && r.content.trim().length > 0) { - document.getElementById("sillywordz-content").innerText = + document.getElementById("sillywordz-content").innerHTML = "And I had this to say about it: " + r.content; }