Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
86 changes: 86 additions & 0 deletions databaseutil/databaseutil.go
Original file line number Diff line number Diff line change
Expand Up @@ -154,6 +154,92 @@ func GetAllUserData() ([]*UserData, error) {
return users, nil
}

// ==================================

func UpdateNoteContent(id int64, content string) error {
sqlQuery := `
UPDATE note SET content = ($2) WHERE id = ($1)`

rows, err := db.Query(sqlQuery, id, content)
if err != nil {
return convertPostgresError(err)
}
defer rows.Close()

if err := rows.Err(); err != nil {
return convertPostgresError(err)
}

return nil

}

func UpdateNoteCategory(id int64, category string) error {
sqlQuery := `
INSERT INTO note_to_category_relationship (note_id, type)
VALUES ($1, $2)
ON CONFLICT (note_id) DO UPDATE SET type = ($2)`

rows, err := db.Query(sqlQuery, id, category)
if err != nil {
return convertPostgresError(err)
}
defer rows.Close()

if err := rows.Err(); err != nil {
return convertPostgresError(err)
}

return nil
}

func DeleteNoteCategory(id int64) error {
sqlQuery := `
DELETE FROM note_to_category_relationship
WHERE note_id = $1`

rows, err := db.Query(sqlQuery, id)
if err != nil {
return convertPostgresError(err)
}
defer rows.Close()

if err := rows.Err(); err != nil {
return convertPostgresError(err)
}

return nil
}

func GetNoteCategory(id int64) (string, error) {
sqlQuery := `
SELECT type FROM note_to_category_relationship
WHERE note_id = $1`

rows, err := db.Query(sqlQuery, id)
if err != nil {
return "", convertPostgresError(err)
}
defer rows.Close()

var category string = "N/A"
for rows.Next() {
if category != "N/A" {
return "", QueryResultContainedMultipleRowsError
}

if err := rows.Scan(&category); err != nil {
return "", err
}
}

if category == "N/A" {
return "", QueryResultContainedNoRowsError
}

return category, nil
}

type NoteData struct {
Id int64
AuthorId int64
Expand Down
66 changes: 65 additions & 1 deletion handlers/handlers.go
Original file line number Diff line number Diff line change
Expand Up @@ -355,8 +355,72 @@ func HandleNoteApiRequest(

responseWriter.WriteHeader(http.StatusOK)

case http.MethodPut:

type NoteForm struct {
Id int64 `json:"id"`
Content string `json:"content"`
Category string `json:"category"`
}

noteForm := new(NoteForm)

if err := json.NewDecoder(request.Body).Decode(noteForm); err != nil {
http.Error(responseWriter, err.Error(), http.StatusBadRequest)
return
}

if noteForm.Id < 1 {
http.Error(responseWriter, "Invalid Note Id", http.StatusBadRequest)
return
}

note, err := noteservice.GetNoteById(noteForm.Id)
if err != nil {
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}

if note.AuthorId != userId {
http.Error(responseWriter, "You can only edit notes of which you are the author", http.StatusUnauthorized)
return
}

if len(strings.TrimSpace(noteForm.Content)) == 0 {
http.Error(responseWriter, "Note content cannot be empty or just whitespace", http.StatusBadRequest)
return
}

if err := noteservice.UpdateContent(noteForm.Id, noteForm.Content); err != nil {
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}

if noteForm.Category != "" {

category, err := models.DeserializeCategory(strings.ToLower(noteForm.Category))

if err != nil {
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}

if err := noteservice.UpdateCategory(noteForm.Id, category); err != nil {
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}

} else {
if err := noteservice.DeleteCategory(noteForm.Id); err != nil {
http.Error(responseWriter, err.Error(), http.StatusInternalServerError)
return
}
}

responseWriter.WriteHeader(http.StatusOK)

default:
respondWithMethodNotAllowed(responseWriter, http.MethodGet, http.MethodPost, http.MethodDelete)
respondWithMethodNotAllowed(responseWriter, http.MethodGet, http.MethodPost, http.MethodDelete, http.MethodPut)
}
}

Expand Down
39 changes: 34 additions & 5 deletions services/noteservice/noteservice.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,20 +40,19 @@ func GetAllPublishedNotes() ([]*models.Note, error) {
var notes []*models.Note = make([]*models.Note, len(noteData), len(noteData))

for index, noteDatum := range noteData {
notes[index] = noteDateToNote(noteDatum)
notes[index] = noteDataToNote(noteDatum)
}

return notes, nil
}

func noteDateToNote(noteDatum *databaseutil.NoteData) *models.Note {
func noteDataToNote(noteDatum *databaseutil.NoteData) *models.Note {
return &models.Note{
Id: noteDatum.Id,
AuthorId: models.UserId(noteDatum.AuthorId),
Content: noteDatum.Content,
CreationTime: noteDatum.CreationTime,
}

}

func GetMyUnpublishedNotes(userId models.UserId) ([]*models.Note, error) {
Expand All @@ -66,7 +65,7 @@ func GetMyUnpublishedNotes(userId models.UserId) ([]*models.Note, error) {
var notes []*models.Note = make([]*models.Note, len(noteData), len(noteData))

for index, noteDatum := range noteData {
notes[index] = noteDateToNote(noteDatum)
notes[index] = noteDataToNote(noteDatum)
}

return notes, nil
Expand All @@ -79,13 +78,43 @@ func GetNoteById(id int64) (*models.Note, error) {
return nil, err
}

return noteDateToNote(noteData), nil
return noteDataToNote(noteData), nil
}

func DeleteNoteById(id int64) error {
return databaseutil.DeleteNote(id)
}

func UpdateContent(id int64, content string) error {
// TODO Do we allow content updates to published notes?
return databaseutil.UpdateNoteContent(id, content)
}

func UpdateCategory(id int64, category models.Category) error {
// TODO Do we allow category updates to published notes?
return databaseutil.UpdateNoteCategory(id, category.String())
}

func DeleteCategory(id int64) error {
if _, err := GetCategory(id); err != nil {
if err == databaseutil.QueryResultContainedNoRowsError {
return nil
}

return err
}
return databaseutil.DeleteNoteCategory(id)
}

func GetCategory(id int64) (models.Category, error) {
categoryString, err := databaseutil.GetNoteCategory(id)
if err != nil {
return models.MARGINALIA, err
}

return models.DeserializeCategory(categoryString)
}

func StoreNoteCategoryRelationship(
note *models.Note,
category models.Category,
Expand Down