From 8cdf70a4cd0d38842625bde344afa5b7b1e7fd32 Mon Sep 17 00:00:00 2001 From: Roland Osborne Date: Thu, 3 Feb 2022 12:11:51 -0800 Subject: [PATCH] added card not support --- net/server/internal/api_clearCardNotes.go | 63 +++++++++++++++++++++ net/server/internal/api_contact.go | 10 ---- net/server/internal/api_setCardNotes.go | 69 +++++++++++++++++++++++ net/server/internal/modelUtil.go | 6 +- net/server/internal/models.go | 5 +- net/server/internal/ucAddContact_test.go | 22 +++++++- 6 files changed, 160 insertions(+), 15 deletions(-) create mode 100644 net/server/internal/api_clearCardNotes.go create mode 100644 net/server/internal/api_setCardNotes.go diff --git a/net/server/internal/api_clearCardNotes.go b/net/server/internal/api_clearCardNotes.go new file mode 100644 index 00000000..9cbedeca --- /dev/null +++ b/net/server/internal/api_clearCardNotes.go @@ -0,0 +1,63 @@ +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.GroupSlot").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 + } + + // update card + slot.Revision = account.CardRevision + 1 + slot.Card.Notes = "" + + // save and update contact revision + err = store.DB.Transaction(func(tx *gorm.DB) error { + if res := tx.Save(&slot.Card).Error; res != nil { + return res + } + if res := tx.Preload("Card").Save(&slot).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, getCardModel(&slot)); +} + diff --git a/net/server/internal/api_contact.go b/net/server/internal/api_contact.go index 0c41100c..8914dccf 100644 --- a/net/server/internal/api_contact.go +++ b/net/server/internal/api_contact.go @@ -18,11 +18,6 @@ func ClearCardGroup(w http.ResponseWriter, r *http.Request) { 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 GetCardData(w http.ResponseWriter, r *http.Request) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) @@ -48,11 +43,6 @@ func RemoveCard(w http.ResponseWriter, r *http.Request) { 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) { w.Header().Set("Content-Type", "application/json; charset=UTF-8") w.WriteHeader(http.StatusOK) diff --git a/net/server/internal/api_setCardNotes.go b/net/server/internal/api_setCardNotes.go new file mode 100644 index 00000000..bb86fe9b --- /dev/null +++ b/net/server/internal/api_setCardNotes.go @@ -0,0 +1,69 @@ +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, ¬es); err != nil { + ErrResponse(w, http.StatusBadRequest, err) + return + } + + // load referenced card + var slot store.CardSlot + if err := store.DB.Preload("Card.Groups.GroupSlot").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 + } + + // update card + slot.Revision = account.CardRevision + 1 + slot.Card.Notes = notes + + // save and update contact revision + err = store.DB.Transaction(func(tx *gorm.DB) error { + if res := tx.Save(&slot.Card).Error; res != nil { + return res + } + if res := tx.Preload("Card").Save(&slot).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, getCardModel(&slot)); +} + diff --git a/net/server/internal/modelUtil.go b/net/server/internal/modelUtil.go index 1312a861..e265c8a1 100644 --- a/net/server/internal/modelUtil.go +++ b/net/server/internal/modelUtil.go @@ -20,7 +20,8 @@ func getCardModel(slot *store.CardSlot) *Card { return &Card{ CardId: slot.CardSlotId, - CardData: &CardData { + Revision: slot.Revision, + CardData: &CardData { NotifiedProfile: slot.Card.NotifiedProfile, NotifiedContent: slot.Card.NotifiedContent, NotifiedLabel: slot.Card.NotifiedLabel, @@ -53,6 +54,7 @@ func getGroupModel(slot *store.GroupSlot) *Group { return &Group{ GroupId: slot.GroupSlotId, + Revision: slot.Revision, GroupData: &GroupData { DataType: slot.Group.DataType, Data: slot.Group.GroupData.Data, @@ -67,6 +69,7 @@ func getArticleModel(slot *store.ArticleSlot, contact bool, shared bool) *Articl if !shared || slot.Article == nil { return &Article{ ArticleId: slot.ArticleSlotId, + Revision: slot.Revision, } } @@ -84,6 +87,7 @@ func getArticleModel(slot *store.ArticleSlot, contact bool, shared bool) *Articl return &Article{ ArticleId: slot.ArticleSlotId, + Revision: slot.Revision, ArticleData: &ArticleData{ DataType: slot.Article.DataType, Data: slot.Article.Data, diff --git a/net/server/internal/models.go b/net/server/internal/models.go index b69b7fc3..9882a8c3 100644 --- a/net/server/internal/models.go +++ b/net/server/internal/models.go @@ -45,6 +45,7 @@ type Subject struct { type Article struct { ArticleId string `json:"article_id"` + Revision int64 `json:"revision"` ArticleData *ArticleData `json:"articleData"` } @@ -83,12 +84,12 @@ type Asset struct { type Card struct { CardId string `json:"cardId"` + Revision int64 `json:"revision"` CardData *CardData `json:"cardData"` } type CardData struct { CardProfile *CardProfile `json:"cardProfile"` - CardData *CardData `json:"cardData"` NotifiedProfile int64 `json:"notifiedProfile"` NotifiedContent int64 `json:"notifiedContent"` NotifiedLabel int64 `json:"notifiedLabel"` @@ -144,6 +145,7 @@ type DialogueInsights struct { type Group struct { GroupId string `json:"groupId"` + Revision int64 `json:"revision"` GroupData *GroupData `json:"groupData"` } @@ -168,6 +170,7 @@ type Insight struct { type Label struct { LabelId string `json:"labelId"` + Revision int64 `json:"revision"` LabelData *LabelData `json:"labelData"` } diff --git a/net/server/internal/ucAddContact_test.go b/net/server/internal/ucAddContact_test.go index fe372534..28a1f4a4 100644 --- a/net/server/internal/ucAddContact_test.go +++ b/net/server/internal/ucAddContact_test.go @@ -13,7 +13,7 @@ func TestAddContact(t *testing.T) { var r *Revision var msg DataMessage var cards []Card - var card Card + var card *Card // setup testing group set, err = AddTestGroup("addaccount") @@ -38,21 +38,37 @@ func TestAddContact(t *testing.T) { r = GetTestRevision(set.B.Revisions) assert.NotEqual(t, rev.Card, r.Card) - assert.NoError(t, SendEndpointTest(GetCards, "PUT", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards)) + assert.NoError(t, SendEndpointTest(GetCards, "GET", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards)) assert.Equal(t, 1, len(cards)) assert.Equal(t, set.A.Guid, cards[0].CardData.CardProfile.Guid) assert.NotEqual(t, "Namer", cards[0].CardData.CardProfile.Name) rev = r + card = &Card{} assert.NoError(t, SendEndpointTest(GetProfileMessage, "GET", "/profile/message", nil, nil, APP_TOKENCONTACT, set.B.A.Token, &msg)) assert.NoError(t, SendEndpointTest(SetCardProfile, "PUT", "/contact/cards/{cardId}/profile", &map[string]string{"cardId":cards[0].CardId}, msg, APP_TOKENAPP, set.B.Token, &card)) r = GetTestRevision(set.B.Revisions) assert.NotEqual(t, rev.Card, r.Card) - assert.NoError(t, SendEndpointTest(GetCards, "PUT", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards)) + assert.NoError(t, SendEndpointTest(GetCards, "GET", "/contact/cards?cardRevision=" + strconv.FormatInt(rev.Card, 10), nil, nil, APP_TOKENAPP, set.B.Token, &cards)) assert.Equal(t, 1, len(cards)) assert.Equal(t, set.A.Guid, cards[0].CardData.CardProfile.Guid) assert.Equal(t, "Namer", cards[0].CardData.CardProfile.Name) rev = r + + card = &Card{} + assert.NoError(t, SendEndpointTest(SetCardNotes, "PUT", "/contact/cards/{cardId}/notes", &map[string]string{"cardId":cards[0].CardId}, "some interesting notes", APP_TOKENAPP, set.B.Token, &card)) + assert.Equal(t, "some interesting notes", card.CardData.Notes) + r = GetTestRevision(set.B.Revisions) + assert.NotEqual(t, rev.Card, r.Card) + rev = r + + card = &Card{} + assert.NoError(t, SendEndpointTest(ClearCardNotes, "DELETE", "/contact/cards/{cardId}/notes", &map[string]string{"cardId":cards[0].CardId}, nil, APP_TOKENAPP, set.B.Token, &card)) + assert.Equal(t, "", card.CardData.Notes) + r = GetTestRevision(set.B.Revisions) + assert.NotEqual(t, rev.Card, r.Card) + rev = r + }