fixed deleting and editing also all status show up on homepage now

This commit is contained in:
aggie 2025-11-26 04:32:58 -05:00
parent eac0e88214
commit 8951a7f080
5 changed files with 110 additions and 40 deletions

View file

@ -31,7 +31,14 @@ func (p statusQueryBuilder) build() string {
func (s *Storage) populateStatus(rows *sql.Rows) (model.Status, error) { func (s *Storage) populateStatus(rows *sql.Rows) (model.Status, error) {
var status model.Status 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 { if err != nil {
return status, err return status, err
} }
@ -45,30 +52,39 @@ func (s *Storage) CreateStatus(status model.Status) error {
if err != nil { if err != nil {
return err 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() tx.Rollback()
return err 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() tx.Rollback()
return err return err
} }
err = tx.Commit()
return err return tx.Commit()
} }
func (s *Storage) StatusById(id int64) (model.Status, error) { func (s *Storage) StatusById(id int64) (model.Status, error) {
var status model.Status var status model.Status
err := s.db.QueryRow( 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.Id,
&status.User, &status.User,
&status.Content, &status.Content,
&status.Face, &status.Face,
&status.CreatedAt, &status.CreatedAt,
&status.Number, &status.Number,
) )
return status, err return status, err
} }
@ -82,6 +98,7 @@ func (s *Storage) StatusByUsername(user string, perPage int, page int64) ([]mode
if err != nil { if err != nil {
return nil, false, err return nil, false, err
} }
var statuses []model.Status var statuses []model.Status
for rows.Next() { for rows.Next() {
post, err := s.populateStatus(rows) post, err := s.populateStatus(rows)
@ -90,10 +107,12 @@ func (s *Storage) StatusByUsername(user string, perPage int, page int64) ([]mode
} }
statuses = append(statuses, post) statuses = append(statuses, post)
} }
if len(statuses) > perPage { 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) { func (s *Storage) StatusFeed() ([]model.Status, error) {
@ -103,6 +122,7 @@ func (s *Storage) StatusFeed() ([]model.Status, error) {
if err != nil { if err != nil {
return nil, err return nil, err
} }
var statuses []model.Status var statuses []model.Status
for rows.Next() { for rows.Next() {
post, err := s.populateStatus(rows) post, err := s.populateStatus(rows)
@ -111,7 +131,8 @@ func (s *Storage) StatusFeed() ([]model.Status, error) {
} }
statuses = append(statuses, post) statuses = append(statuses, post)
} }
return statuses, err
return statuses, nil
} }
func (s *Storage) Statuses(page int64, perPage int) ([]model.Status, bool, error) { 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 { if err != nil {
return nil, false, err return nil, false, err
} }
var statuses []model.Status var statuses []model.Status
for rows.Next() { for rows.Next() {
post, err := s.populateStatus(rows) post, err := s.populateStatus(rows)
if err != nil { if err != nil {
return statuses, false, err return nil, false, err
} }
statuses = append(statuses, post) statuses = append(statuses, post)
} }
if len(statuses) > perPage { 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) { func (s *Storage) LatestStatuses() ([]model.Status, error) {
rows, err := s.db.Query(` rows, err := s.db.Query(`
select SELECT
statuses.id, statuses.id,
users.name, users.name,
statuses.content, statuses.content,
statuses.created_at, statuses.created_at,
statuses.face, statuses.face,
statuses.number statuses.number
from FROM users
users INNER JOIN statuses
inner join statuses ON users.status_id = statuses.id
on users.status_id = statuses.id ORDER BY statuses.created_at DESC;
order by statuses.created_at desc;
`) `)
if err != nil { if err != nil {
return nil, err return nil, err
} }
var statuses []model.Status var statuses []model.Status
for rows.Next() { for rows.Next() {
post, err := s.populateStatus(rows) post, err := s.populateStatus(rows)
@ -162,15 +186,29 @@ func (s *Storage) LatestStatuses() ([]model.Status, error) {
} }
statuses = append(statuses, post) statuses = append(statuses, post)
} }
return statuses, err
return statuses, nil
} }
func (s *Storage) UpdateStatus(status model.Status) error { 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 { if err != nil {
return err 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 return err
} }
@ -180,42 +218,72 @@ func (s *Storage) DeleteStatus(id int64, author string) error {
if err != nil { if err != nil {
return err return err
} }
var latestId int64 var latestId int64
if err := tx.QueryRowContext(ctx, `select status_id from users where name = $1`, if err := tx.QueryRowContext(ctx,
author).Scan(&latestId); err != nil { `SELECT status_id FROM users WHERE name = $1`,
author,
).Scan(&latestId); err != nil {
tx.Rollback() tx.Rollback()
return err 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() tx.Rollback()
return err 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() tx.Rollback()
return err return err
} }
if latestId == id { if latestId == id {
var newId int64 var newId int64
if err := tx.QueryRowContext(ctx, `select id from statuses where author = $1 order by created_at desc limit 1;`, err := tx.QueryRowContext(ctx,
author).Scan(&newId); err != nil { `SELECT id FROM statuses
if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, nil, author); err != nil { 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() tx.Rollback()
return err return err
} }
err = tx.Commit() } else if err == nil {
return err _, err = tx.ExecContext(ctx,
} `UPDATE users SET status_id = $1 WHERE name = $2`,
if _, err := tx.ExecContext(ctx, `UPDATE users set status_id=$1 where name=$2`, newId, author); err != nil { newId, author)
if err != nil {
tx.Rollback()
return err
}
} else {
tx.Rollback() tx.Rollback()
return err return err
} }
} else { } 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() tx.Rollback()
return err return err
} }
} }
err = tx.Commit() return tx.Commit()
return err
} }

View file

@ -37,6 +37,7 @@ var TplCommonMap = map[string]string{
{{ template "content" . }} {{ template "content" . }}
</main> </main>
<footer> <footer>
<small><a href="https://treasurechest.alien.town/agnes/s1llyw0rdz">source</a></small>
</footer> </footer>
</div> </div>

View file

@ -27,6 +27,7 @@
{{ template "content" . }} {{ template "content" . }}
</main> </main>
<footer> <footer>
<small><a href="https://treasurechest.alien.town/agnes/s1llyw0rdz">source</a></small>
</footer> </footer>
</div> </div>

View file

@ -14,7 +14,7 @@ type Update struct {
func (h *Handler) showIndexView(w http.ResponseWriter, r *http.Request) { func (h *Handler) showIndexView(w http.ResponseWriter, r *http.Request) {
protectClickJacking(w) protectClickJacking(w)
user, _ := h.sess.Get(r) user, _ := h.sess.Get(r)
statuses, err := h.storage.LatestStatuses() statuses, err := h.storage.StatusFeed()
if err != nil { if err != nil {
serverError(w, err) serverError(w, err)
return return

View file

@ -33,7 +33,7 @@ fetch("https://sillywordz.kissing.computer/users/` + escName + `/status.json")
"I wrote " + r.number + " words on my project!"; "I wrote " + r.number + " words on my project!";
if (r.content && r.content.trim().length > 0) { 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; "And I had this to say about it: " + r.content;
} }