/// Defines objects that interact with the db package model import ( "database/sql" "git.nagee.dev/isthisnagee/diary/db" "strings" ) type DiaryEntry struct { Id int64 `json:"id"` Title string `json:"title"` CreatedAt int64 `json:"created_at"` Version int64 `json:"version"` } type App struct { *db.DbCtx } func NewApp(db_path string) (*App, error) { app, err := db.Init(db_path) if err != nil { return nil, err } return &App{app}, nil } func (app *App) NewDiaryEntry(title string) *DiaryEntry { var diary_entry DiaryEntry var result, err = app.Db.Exec("INSERT INTO diary_log (title) values (?);", title) if err != nil { panic(err) } id, err := result.LastInsertId() if err != nil { panic(err) } if err := app.Db.QueryRow( "SELECT id, title, created_at, version FROM diary_log where id=?", id, ).Scan(&diary_entry.Id, &diary_entry.Title, &diary_entry.CreatedAt, &diary_entry.Version); err != nil { panic(err) } return &diary_entry } func (app *App) EditDiaryEntry(id int64, title string) (*DiaryEntryNote, error) { clean_title := strings.TrimSpace(title) result, err := app.Db.Exec("UPDATE diary_log set title=? where id=?", clean_title, id) if err != nil { return nil, err } num_rows_affected, err := result.RowsAffected() if err != nil { return nil, err } if num_rows_affected == 0 { return nil, &NotFoundError{given_id: id} } return app.GetDiaryEntryNote(id) } func (app *App) GetDiaryEntry(id int64) (*DiaryEntry, error) { var diary_entry DiaryEntry if err := app.Db.QueryRow( "SELECT id, title, created_at, version FROM diary_log where id=?", id, ).Scan(&diary_entry.Id, &diary_entry.Title, &diary_entry.CreatedAt, &diary_entry.Version); err != nil { if err == sql.ErrNoRows { return nil, &NotFoundError{given_id: id} } return nil, err } return &diary_entry, nil } func (app *App) DeleteDiaryEntry(id int64) (bool, error) { result, err := app.Db.Exec("DELETE FROM diary_log where id=?", id) if err != nil { return false, err } num_rows_affected, err := result.RowsAffected() if err != nil { return false, err } if num_rows_affected == 0 { return false, &NotFoundError{given_id: id} } return true, nil } type GetDiaryEntriesQuery struct { /// Exclusive CreatedBeforeTs *int64 /// Inclusive CreatedAfterTs *int64 NumEntries *int64 } func (app *App) GetDiaryEntries(q GetDiaryEntriesQuery) []*DiaryEntry { var query = "SELECT id, title, created_at, version FROM diary_log" var whereParams []interface{} if q.CreatedBeforeTs != nil { query += " where created_at < ?" whereParams = append(whereParams, *q.CreatedBeforeTs) } if q.CreatedAfterTs != nil { query += " and created_at >= ?" whereParams = append(whereParams, *q.CreatedAfterTs) } query += " ORDER BY created_at desc, id desc" if q.NumEntries != nil { query += " LIMIT ?" whereParams = append(whereParams, *q.NumEntries) } rows, err := app.Db.Query( query, whereParams..., ) if err != nil { panic(err) } defer rows.Close() var result []*DiaryEntry for rows.Next() { var id, created_at, version int64 var title string err := rows.Scan(&id, &title, &created_at, &version) if err != nil { panic(err) } result = append(result, &DiaryEntry{ Id: id, Title: title, CreatedAt: created_at, Version: version, }) } if err := rows.Err(); err != nil { panic(err) } return result }