diff --git a/net/server/internal/api_addCard.go b/net/server/internal/api_addCard.go index c5749d4a..454eec97 100644 --- a/net/server/internal/api_addCard.go +++ b/net/server/internal/api_addCard.go @@ -69,14 +69,23 @@ func AddCard(w http.ResponseWriter, r *http.Request) { card.Node = identity.Node card.ProfileRevision = identity.Revision card.Status = APP_CARDCONFIRMED - if err := store.DB.Save(&card).Error; err != nil { + + // save and update contact revision + err = store.DB.Transaction(func(tx *gorm.DB) error { + if res := store.DB.Save(&card).Error; res != nil { + return res + } + if res := store.DB.Model(&account).Update("card_revision", account.CardRevision + 1).Error; res != nil { + return res + } + return nil + }) + if err != nil { ErrResponse(w, http.StatusInternalServerError, err) return } - // TODO UPDATE CONTACT REVISION - // TODO SET STATUS - + SetStatus(account) WriteResponse(w, getCardModel(&card)) } diff --git a/net/server/internal/api_setCardStatus.go b/net/server/internal/api_setCardStatus.go index b4087d07..68276eb6 100644 --- a/net/server/internal/api_setCardStatus.go +++ b/net/server/internal/api_setCardStatus.go @@ -45,6 +45,7 @@ func SetCardStatus(w http.ResponseWriter, r *http.Request) { // update card card.Status = status + card.DataRevision += 1 if token != "" { card.OutToken = token } @@ -57,14 +58,22 @@ func SetCardStatus(w http.ResponseWriter, r *http.Request) { card.InToken = hex.EncodeToString(data) } - if err := store.DB.Save(&card).Error; err != nil { + // save and update contact revision + err = store.DB.Transaction(func(tx *gorm.DB) error { + if res := store.DB.Save(&card).Error; res != nil { + return res + } + if res := store.DB.Model(&account).Update("card_revision", account.CardRevision + 1).Error; res != nil { + return res + } + return nil + }) + if err != nil { ErrResponse(w, http.StatusInternalServerError, err) return } - // TODO UPDATE CARD REVISION, CONTACT REVISION - // TODO SET STATUS - + SetStatus(account) WriteResponse(w, getCardModel(&card)); } diff --git a/net/server/internal/ucConnectContact_test.go b/net/server/internal/ucConnectContact_test.go index c9f6cb69..cceb521c 100644 --- a/net/server/internal/ucConnectContact_test.go +++ b/net/server/internal/ucConnectContact_test.go @@ -2,14 +2,18 @@ package databag import ( "testing" + "encoding/json" + "github.com/gorilla/websocket" "github.com/gorilla/mux" "github.com/stretchr/testify/assert" ) func TestConnectContact(t *testing.T) { var card Card + var revision Revision var msg DataMessage var vars map[string]string + var cardRevision int64 // create some contacts for this test access := AddTestContacts(t, "connect", 2) @@ -20,12 +24,27 @@ func TestConnectContact(t *testing.T) { GetProfileMessage(w, r) assert.NoError(t, ReadResponse(w, &msg)) + // app connects websocket + ws := getTestWebsocket() + announce := Announce{ AppToken: access[1] } + data, _ := json.Marshal(&announce) + ws.WriteMessage(websocket.TextMessage, data) + _, data, _ = ws.ReadMessage() + assert.NoError(t, json.Unmarshal(data, &revision)) + cardRevision = revision.Card + // add A card in B r, w, _ = NewRequest("POST", "/contact/cards", &msg) SetBearerAuth(r, access[1]) AddCard(w, r) assert.NoError(t, ReadResponse(w, &card)) + // profile revision incremented + _, data, _ = ws.ReadMessage() + assert.NoError(t, json.Unmarshal(data, &revision)) + assert.NotEqual(t, cardRevision, revision.Card) + cardRevision = revision.Card + // update A status to connecting r, w, _ = NewRequest("PUT", "/contact/cards/{cardId}/status", APP_CARDCONNECTING) vars = map[string]string{ "cardId": card.CardId } @@ -34,6 +53,14 @@ func TestConnectContact(t *testing.T) { SetCardStatus(w, r) assert.NoError(t, ReadResponse(w, &card)) + // profile revision incremented + _, data, _ = ws.ReadMessage() + assert.NoError(t, json.Unmarshal(data, &revision)) + assert.NotEqual(t, cardRevision, revision.Card) + cardRevision = revision.Card + +PrintMsg(revision) + // get open message to A r, w, _ = NewRequest("GET", "/contact/cards/{cardId}/openMessage", nil) vars = map[string]string{ "cardId": card.CardId }