testing card notes

This commit is contained in:
Roland Osborne 2022-02-11 00:29:19 -08:00
parent 19ed1b8177
commit 342c9a79d9
5 changed files with 164 additions and 17 deletions

View File

@ -0,0 +1,61 @@
package databag
import (
"errors"
"net/http"
"gorm.io/gorm"
"github.com/gorilla/mux"
"databag/internal/store"
)
func ClearCardNotes(w http.ResponseWriter, r *http.Request) {
account, code, err := BearerAppToken(r, false);
if err != nil {
ErrResponse(w, code, err)
return
}
// scan parameters
params := mux.Vars(r)
cardId := params["cardId"]
// load referenced card
var slot store.CardSlot
if err := store.DB.Preload("Card.Groups").Where("account_id = ? AND card_slot_id = ?", account.ID, cardId).First(&slot).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusInternalServerError, err)
} else {
ErrResponse(w, http.StatusNotFound, err)
}
return
}
if slot.Card == nil {
ErrResponse(w, http.StatusNotFound, errors.New("card has been deleted"))
return
}
// save and update contact revision
err = store.DB.Transaction(func(tx *gorm.DB) error {
slot.Card.Notes = ""
slot.Card.DetailRevision += 1
if res := tx.Save(&slot.Card).Error; res != nil {
return res
}
if res := tx.Model(&slot).Update("revision", account.CardRevision + 1).Error; res != nil {
return res
}
if res := tx.Model(&account).Update("card_revision", account.CardRevision + 1).Error; res != nil {
return res
}
return nil
})
if err != nil {
ErrResponse(w, http.StatusInternalServerError, err)
return
}
SetStatus(account)
WriteResponse(w, getCardDetailModel(&slot));
}

View File

@ -18,11 +18,6 @@ func ClearCardGroup(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
func ClearCardNotes(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func GetCloseMessage(w http.ResponseWriter, r *http.Request) { func GetCloseMessage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
@ -33,11 +28,6 @@ func RemoveCard(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)
} }
func SetCardNotes(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK)
}
func SetCloseMessage(w http.ResponseWriter, r *http.Request) { func SetCloseMessage(w http.ResponseWriter, r *http.Request) {
w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.Header().Set("Content-Type", "application/json; charset=UTF-8")
w.WriteHeader(http.StatusOK) w.WriteHeader(http.StatusOK)

View File

@ -16,7 +16,7 @@ func GetCards(w http.ResponseWriter, r *http.Request) {
return return
} }
card := r.FormValue("cardRevision") card := r.FormValue("revision")
if card != "" { if card != "" {
cardRevisionSet = true cardRevisionSet = true
if cardRevision, err = strconv.ParseInt(card, 10, 64); err != nil { if cardRevision, err = strconv.ParseInt(card, 10, 64); err != nil {
@ -28,7 +28,7 @@ func GetCards(w http.ResponseWriter, r *http.Request) {
var response []*Card var response []*Card
if cardRevisionSet { if cardRevisionSet {
var slots []store.CardSlot var slots []store.CardSlot
if err := store.DB.Where("account_id = ? AND revision > ?", account.ID, cardRevision).Find(&slots).Error; err != nil { if err := store.DB.Preload("Card").Where("account_id = ? AND revision > ?", account.ID, cardRevision).Find(&slots).Error; err != nil {
ErrResponse(w, http.StatusInternalServerError, err) ErrResponse(w, http.StatusInternalServerError, err)
return return
} }

View File

@ -0,0 +1,67 @@
package databag
import (
"errors"
"net/http"
"gorm.io/gorm"
"github.com/gorilla/mux"
"databag/internal/store"
)
func SetCardNotes(w http.ResponseWriter, r *http.Request) {
account, code, err := BearerAppToken(r, false);
if err != nil {
ErrResponse(w, code, err)
return
}
// scan parameters
params := mux.Vars(r)
cardId := params["cardId"]
var notes string
if err := ParseRequest(r, w, &notes); err != nil {
ErrResponse(w, http.StatusBadRequest, err)
return
}
// load referenced card
var slot store.CardSlot
if err := store.DB.Preload("Card.Groups").Where("account_id = ? AND card_slot_id = ?", account.ID, cardId).First(&slot).Error; err != nil {
if !errors.Is(err, gorm.ErrRecordNotFound) {
ErrResponse(w, http.StatusInternalServerError, err)
} else {
ErrResponse(w, http.StatusNotFound, err)
}
return
}
if slot.Card == nil {
ErrResponse(w, http.StatusNotFound, errors.New("card has been deleted"))
return
}
// save and update contact revision
err = store.DB.Transaction(func(tx *gorm.DB) error {
slot.Card.Notes = notes
slot.Card.DetailRevision += 1
if res := tx.Save(&slot.Card).Error; res != nil {
return res
}
if res := tx.Model(&slot).Update("revision", account.CardRevision + 1).Error; res != nil {
return res
}
if res := tx.Model(&account).Update("card_revision", account.CardRevision + 1).Error; res != nil {
return res
}
return nil
})
if err != nil {
ErrResponse(w, http.StatusInternalServerError, err)
return
}
SetStatus(account)
WriteResponse(w, getCardDetailModel(&slot));
}

View File

@ -16,7 +16,11 @@ func TestContactSync(t *testing.T) {
var data []byte var data []byte
var hdr map[string][]string var hdr map[string][]string
var res error var res error
var cards []Card var cards *[]Card
var cardRevision string
var detailRevision int64
var detail CardDetail
var rev *Revision
// setup testing group // setup testing group
set, err := AddTestGroup("contactsync") set, err := AddTestGroup("contactsync")
@ -45,11 +49,36 @@ func TestContactSync(t *testing.T) {
assert.Zero(t, bytes.Compare(img, data)) assert.Zero(t, bytes.Compare(img, data))
// get full card list // get full card list
cards = &[]Card{}
assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards", assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards",
nil, nil, APP_TOKENAPP, set.B.Token, &cards, &hdr)) nil, nil, APP_TOKENAPP, set.B.Token, cards, &hdr))
cardRevision = hdr["Card-Revision"][0]
cards = &[]Card{}
assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + cardRevision,
nil, nil, APP_TOKENAPP, set.B.Token, cards, &hdr))
cardRevision = hdr["Card-Revision"][0]
assert.Equal(t, 0, len(*cards))
PrintMsg(set.B.A.CardId) // set card notes
PrintMsg(hdr) GetTestRevision(set.B.Revisions)
PrintMsg(cards) assert.NoError(t, ApiTestMsg(SetCardNotes, "PUT", "/conact/cards/{cardId}/notes",
&param, "CardA notes", APP_TOKENAPP, set.B.Token, &detail, nil))
rev = GetTestRevision(set.B.Revisions)
cards = &[]Card{}
assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + cardRevision,
nil, nil, APP_TOKENAPP, set.B.Token, cards, &hdr))
assert.Equal(t, 1, len(*cards))
detailRevision = (*cards)[0].Data.DetailRevision
// clear card notes
GetTestRevision(set.B.Revisions)
assert.NoError(t, ApiTestMsg(ClearCardNotes, "DELETE", "/conact/cards/{cardId}/notes",
&param, nil, APP_TOKENAPP, set.B.Token, &detail, nil))
assert.NotEqual(t, rev.Card, GetTestRevision(set.B.Revisions).Card)
cards = &[]Card{}
assert.NoError(t, ApiTestMsg(GetCards, "GET", "/contact/cards?revision=" + cardRevision,
nil, nil, APP_TOKENAPP, set.B.Token, cards, &hdr))
assert.Equal(t, 1, len(*cards))
assert.NotEqual(t, detailRevision, (*cards)[0].Data.DetailRevision)
} }