From c7abc0acc371ad2146537ca5348f4fe71ffafe86 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Wed, 7 Feb 2018 18:53:31 +0200 Subject: [PATCH 1/6] Implemented migration of star models: - added 'id' column to Star model (updated mapping to DBStar, DBStarMessage) and rename old 'id' column to 'client_id' according to server protocol. - save 'feedName', 'senderName' and 'senderAvatar' columns in DBStarMessage. --- Nynja.xcodeproj/project.pbxproj | 5 ++-- Nynja/DB/Models/DBStar.swift | 12 +++++--- Nynja/DB/Models/DBStarMessage.swift | 6 ++++ Nynja/DB/Tables/StarMessageTable.swift | 6 ++++ Nynja/DB/Tables/StarTable.swift | 4 ++- Nynja/Extensions/Models/StarExtension.swift | 1 + Nynja/Library/Model/Star.swift | 4 ++- Nynja/Library/Source/Decoder.swift | 13 ++++---- Nynja/Library/Spec/Star_Spec.swift | 30 +++++++++++-------- Nynja/MigrationManager.swift | 12 ++++++++ .../Interactor/FavoritesInteractor.swift | 4 +-- .../Interactor/MessageInteractor.swift | 4 +-- .../Message/Presenter/MessagePresenter.swift | 6 ++-- .../Interactor/ProfileInteractor.swift | 4 +-- .../Cells/StarCell/StarMessageCell.swift | 2 +- Nynja/Services/MQTT/StarExtension+BERT.swift | 8 +++-- 16 files changed, 82 insertions(+), 39 deletions(-) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 0e74a41c2..aaad6f54d 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -5269,6 +5269,7 @@ }; 3ABCE8EC1EC9330D00A80B15 = { CreatedOnToolsVersion = 8.3.2; + DevelopmentTeam = 9GKQ5AMF2B; LastSwiftMigration = 0830; ProvisioningStyle = Automatic; SystemCapabilities = { @@ -6669,7 +6670,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9GKQ5AMF2B; ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/Nynja/Resources/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; @@ -6698,7 +6699,7 @@ "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = "iPhone Developer"; CODE_SIGN_STYLE = Automatic; DEFINES_MODULE = YES; - DEVELOPMENT_TEAM = ""; + DEVELOPMENT_TEAM = 9GKQ5AMF2B; ENABLE_BITCODE = NO; INFOPLIST_FILE = "$(SRCROOT)/Nynja/Resources/Info.plist"; IPHONEOS_DEPLOYMENT_TARGET = 9.0; diff --git a/Nynja/DB/Models/DBStar.swift b/Nynja/DB/Models/DBStar.swift index 52a75cfea..2477c2e0a 100644 --- a/Nynja/DB/Models/DBStar.swift +++ b/Nynja/DB/Models/DBStar.swift @@ -10,7 +10,8 @@ import Foundation import GRDB class DBStar: Record, DBModelProtocol { - var id: String? + var id: Int64? + var clientId: String? var rosterId: Int64? var message: DBStarMessage? var messageID: Int64? @@ -19,8 +20,9 @@ class DBStar: Record, DBModelProtocol { // MARK: - Mapping init?(star: Star) { + self.id = star.id + self.clientId = star.client_id ?? IdGenerator.generateUniqueId() self.rosterId = star.roster_id - self.id = star.id ?? IdGenerator.generateUniqueId() self.status = (star.status as? StringAtom)?.string if let msg = star.message { self.message = DBStarMessage(message: msg) @@ -34,17 +36,19 @@ class DBStar: Record, DBModelProtocol { } required init(row: Row) { + id = row[StarTable.Column.id.title] + clientId = row[StarTable.Column.clientId.title] rosterId = row[StarTable.Column.rosterId.title] status = row[StarTable.Column.status.title] - id = row[StarTable.Column.id.title] messageID = row[StarTable.Column.messageId.title] super.init() } override func encode(to container: inout PersistenceContainer) { + container[StarTable.Column.id.title] = id + container[StarTable.Column.clientId.title] = clientId container[StarTable.Column.rosterId.title] = rosterId container[StarTable.Column.status.title] = status - container[StarTable.Column.id.title] = id container[StarTable.Column.messageId.title] = messageID } diff --git a/Nynja/DB/Models/DBStarMessage.swift b/Nynja/DB/Models/DBStarMessage.swift index d450ee9a3..8a679f0e8 100644 --- a/Nynja/DB/Models/DBStarMessage.swift +++ b/Nynja/DB/Models/DBStarMessage.swift @@ -86,6 +86,9 @@ class DBStarMessage: Record, DBModelProtocol { self.editMessage = row[StarMessageTable.Column.editMessage.title] self.repliedBy = row[StarMessageTable.Column.repliedBy.title] self.status = row[StarMessageTable.Column.status.title] + self.feedName = row[StarMessageTable.Column.feedName.title] + self.senderName = row[StarMessageTable.Column.senderName.title] + self.senderAvatar = row[StarMessageTable.Column.senderAvatar.title] super.init() } @@ -106,6 +109,9 @@ class DBStarMessage: Record, DBModelProtocol { container[StarMessageTable.Column.editMessage.title] = self.editMessage container[StarMessageTable.Column.repliedBy.title] = self.repliedBy container[StarMessageTable.Column.status.title] = self.status + container[StarMessageTable.Column.feedName.title] = self.feedName + container[StarMessageTable.Column.senderName.title] = self.senderName + container[StarMessageTable.Column.senderAvatar.title] = self.senderAvatar } override func didInsert(with rowID: Int64, for column: String?) { diff --git a/Nynja/DB/Tables/StarMessageTable.swift b/Nynja/DB/Tables/StarMessageTable.swift index c46f87038..bd157c427 100644 --- a/Nynja/DB/Tables/StarMessageTable.swift +++ b/Nynja/DB/Tables/StarMessageTable.swift @@ -33,6 +33,9 @@ class StarMessageTable: Table { t.column(Column.editMessage, .integer) t.column(Column.repliedBy, .text) t.column(Column.status, .text) + t.column(Column.feedName, .text) + t.column(Column.senderName, .text) + t.column(Column.senderAvatar, .text) }) } @@ -57,6 +60,9 @@ extension StarMessageTable { case editMessage // link case repliedBy case status + case feedName + case senderName + case senderAvatar } } diff --git a/Nynja/DB/Tables/StarTable.swift b/Nynja/DB/Tables/StarTable.swift index 09bc755ac..c3c91e92d 100644 --- a/Nynja/DB/Tables/StarTable.swift +++ b/Nynja/DB/Tables/StarTable.swift @@ -16,7 +16,8 @@ class StarTable: Table { func create(in db: Database) throws { try db.create(table: StarTable.name, body: { (t) in - t.column(Column.id, .text).notNull().primaryKey() + t.column(Column.id, .integer) + t.column(Column.clientId, .text).notNull().primaryKey() t.column(Column.status, .text) t.column(Column.rosterId, .integer).references(RosterTable.name, onDelete: .cascade) t.column(Column.messageId, .integer).references(StarMessageTable.name, onDelete: .cascade) @@ -30,6 +31,7 @@ extension StarTable { enum Column: Int, Describable { case id + case clientId case status case rosterId case messageId diff --git a/Nynja/Extensions/Models/StarExtension.swift b/Nynja/Extensions/Models/StarExtension.swift index 7cd926185..0547d1319 100644 --- a/Nynja/Extensions/Models/StarExtension.swift +++ b/Nynja/Extensions/Models/StarExtension.swift @@ -83,6 +83,7 @@ extension Star: DialogCellModel { convenience init(star: DBStar) { self.init() self.id = star.id + self.client_id = star.clientId if let msg = star.message { self.message = Message(message: msg) } diff --git a/Nynja/Library/Model/Star.swift b/Nynja/Library/Model/Star.swift index c89f12ecd..dcfc6f9dc 100644 --- a/Nynja/Library/Model/Star.swift +++ b/Nynja/Library/Model/Star.swift @@ -1,8 +1,10 @@ class Star { - var id: String? + var id: Int64? + var client_id: String? var roster_id: Int64? var message: Message? var tags: [Tag]? var status: AnyObject? } + diff --git a/Nynja/Library/Source/Decoder.swift b/Nynja/Library/Source/Decoder.swift index d202c77d0..c751963ae 100644 --- a/Nynja/Library/Source/Decoder.swift +++ b/Nynja/Library/Source/Decoder.swift @@ -253,13 +253,14 @@ func parseObject(name: String, body:[Model], tuple: BertTuple) -> AnyObject? a_Tag.status = body[3].parse(bert: tuple.elements[4]) as? AnyObject return a_Tag case "Star": - if body.count != 5 { return nil } + if body.count != 6 { return nil } let a_Star = Star() - a_Star.id = body[0].parse(bert: tuple.elements[1]) as? String - a_Star.roster_id = body[1].parse(bert: tuple.elements[2]) as? Int64 - a_Star.message = body[2].parse(bert: tuple.elements[3]) as? Message - a_Star.tags = body[3].parse(bert: tuple.elements[4]) as? [Tag] - a_Star.status = body[4].parse(bert: tuple.elements[5]) as? AnyObject + a_Star.id = body[0].parse(bert: tuple.elements[1]) as? Int64 + a_Star.client_id = body[1].parse(bert: tuple.elements[2]) as? String + a_Star.roster_id = body[2].parse(bert: tuple.elements[3]) as? Int64 + a_Star.message = body[3].parse(bert: tuple.elements[4]) as? Message + a_Star.tags = body[4].parse(bert: tuple.elements[5]) as? [Tag] + a_Star.status = body[5].parse(bert: tuple.elements[6]) as? AnyObject return a_Star case "History": if body.count != 6 { return nil } diff --git a/Nynja/Library/Spec/Star_Spec.swift b/Nynja/Library/Spec/Star_Spec.swift index 69b76ef26..b2acb5fa1 100644 --- a/Nynja/Library/Spec/Star_Spec.swift +++ b/Nynja/Library/Spec/Star_Spec.swift @@ -1,14 +1,18 @@ func get_Star() -> Model { - return Model(value:Tuple(name:"Star",body:[ - Model(value:Chain(types:[ - Model(value:List(constant:"")), - Model(value:Binary())])), - Model(value:Chain(types:[ - Model(value:List(constant:"")), - Model(value:Number())])), - get_Message(), - Model(value:List(constant:nil,model:get_Tag())), - Model(value:Chain(types:[ - Model(value:List(constant:"")), - Model(value:Atom(constant:"add")), - Model(value:Atom(constant:"remove"))]))]))} + return Model(value:Tuple(name:"Star",body:[ + Model(value:Chain(types:[ + Model(value:List(constant:"")), + Model(value:Number())])), + Model(value:Chain(types:[ + Model(value:List(constant:"")), + Model(value:Binary())])), + Model(value:Chain(types:[ + Model(value:List(constant:"")), + Model(value:Number())])), + get_Message(), + Model(value:List(constant:nil,model:get_Tag())), + Model(value:Chain(types:[ + Model(value:List(constant:"")), + Model(value:Atom(constant:"add")), + Model(value:Atom(constant:"remove"))]))]))} + diff --git a/Nynja/MigrationManager.swift b/Nynja/MigrationManager.swift index 9911ea4e7..d04ec7c07 100644 --- a/Nynja/MigrationManager.swift +++ b/Nynja/MigrationManager.swift @@ -16,6 +16,7 @@ enum Migration: Describable { case createStarMessage case updateChatCheckpoint case addCreatedToContact + case addStarMessageId } class MigrationManager { @@ -111,6 +112,17 @@ class MigrationManager { } } + migrator.registerMigration(Migration.addStarMessageId.title) { db in + let columnMapping = ColumnMapping([ + StarTable.Column.id.title: StarTable.Column.clientId.title + ]) + let stars = try DBStar.fetchAll(db, "SELECT * FROM \(StarTable.name)", adapter: columnMapping) + try db.drop(index: StarTable.name) + try StarTable().create(in: db) + try stars.forEach { star in + try star.saveAggregate(db) + } + } } } diff --git a/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift b/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift index 1a63dddc6..1b14f8065 100644 --- a/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift +++ b/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift @@ -15,8 +15,8 @@ class FavoritesInteractor: FavoritesInteractorInputProtocol, StarHandlerDelegate if let id = (StorageService.sharedInstance.profile.rosters?.first as? Roster)?.id { let stars = try? StorageService.sharedInstance.fetchStars(rosterID: id).values.sorted(by: { (left, right) -> Bool in - let id1 = left.id?.split(separator: "_").last ?? "" - let id2 = right.id?.split(separator: "_").last ?? "" + let id1 = left.client_id?.split(separator: "_").last ?? "" + let id2 = right.client_id?.split(separator: "_").last ?? "" return id1 > id2 }) if stars != nil { diff --git a/Nynja/Modules/Message/Interactor/MessageInteractor.swift b/Nynja/Modules/Message/Interactor/MessageInteractor.swift index 10de5664f..1520e033d 100644 --- a/Nynja/Modules/Message/Interactor/MessageInteractor.swift +++ b/Nynja/Modules/Message/Interactor/MessageInteractor.swift @@ -717,7 +717,7 @@ class MessageInteractor: MessageInteractorInputProtocol, ContactHandlerDelegate, star.message = message star.status = StringAtom(string: "add") star.roster_id = roster.id - star.id = IdGenerator.generateUniqueId() + star.client_id = IdGenerator.generateUniqueId() if let dbStar = DBStar(star: star) { try? StorageService.sharedInstance.perform(action: .save, with: dbStar) } @@ -735,7 +735,7 @@ class MessageInteractor: MessageInteractorInputProtocol, ContactHandlerDelegate, } configuration.stars[localId] = nil MQTTService.sharedInstance.sendStar(star: star) - star.id = nil + star.client_id = nil self.presenter?.changeStarStatus(star: star, localId: localId) } } diff --git a/Nynja/Modules/Message/Presenter/MessagePresenter.swift b/Nynja/Modules/Message/Presenter/MessagePresenter.swift index d429b23cf..2c8cd992e 100644 --- a/Nynja/Modules/Message/Presenter/MessagePresenter.swift +++ b/Nynja/Modules/Message/Presenter/MessagePresenter.swift @@ -259,7 +259,7 @@ class MessagePresenter: MessagePresenterProtocol, MessageInteractorOutputProtoco model = self.attachProgress(model: model, progressModel: progres) } if let localId = message.msg_id { - model.starID = configuration.stars[localId]?.id + model.starID = configuration.stars[localId]?.client_id } cells.append(model) } @@ -325,7 +325,7 @@ class MessagePresenter: MessagePresenterProtocol, MessageInteractorOutputProtoco model = self.attachProgress(model: model, progressModel: progres) } if let localId = message.msg_id { - model.starID = configuration.stars[localId]?.id + model.starID = configuration.stars[localId]?.client_id } cells.append(model) } @@ -537,7 +537,7 @@ class MessagePresenter: MessagePresenterProtocol, MessageInteractorOutputProtoco } func changeStarStatus(star: Star, localId: String) { - view.updateStar(starID: star.id, messageId: localId) + view.updateStar(starID: star.client_id, messageId: localId) } func isSelfChat() -> Bool { diff --git a/Nynja/Modules/Profile/Interactor/ProfileInteractor.swift b/Nynja/Modules/Profile/Interactor/ProfileInteractor.swift index cd7cbfb16..438d36242 100644 --- a/Nynja/Modules/Profile/Interactor/ProfileInteractor.swift +++ b/Nynja/Modules/Profile/Interactor/ProfileInteractor.swift @@ -210,8 +210,8 @@ fileprivate extension ProfileInteractor { if let id = (StorageService.sharedInstance.profile.rosters?.first as? Roster)?.id { let stars = try? StorageService.sharedInstance.fetchStars(rosterID: id).values.sorted(by: { (left, right) -> Bool in - let id1 = left.id?.split(separator: "_").last ?? "" - let id2 = right.id?.split(separator: "_").last ?? "" + let id1 = left.client_id?.split(separator: "_").last ?? "" + let id2 = right.client_id?.split(separator: "_").last ?? "" return id1 > id2 }) if stars != nil { diff --git a/Nynja/Modules/Profile/View/TableView/Cells/StarCell/StarMessageCell.swift b/Nynja/Modules/Profile/View/TableView/Cells/StarCell/StarMessageCell.swift index 97055aaf0..6ccc16493 100644 --- a/Nynja/Modules/Profile/View/TableView/Cells/StarCell/StarMessageCell.swift +++ b/Nynja/Modules/Profile/View/TableView/Cells/StarCell/StarMessageCell.swift @@ -173,7 +173,7 @@ class StarMessageCell: UITableViewCell, ConfigurableCell { // timeLabel.text = DialogDateConverter().toString(createdDate) // } nameLabel.text = model.title - if let timestamp = (model as? Star)?.id?.split(separator: "_").last { + if let timestamp = (model as? Star)?.client_id?.split(separator: "_").last { if let timeS = Double(timestamp) { let date = Date(timeIntervalSince1970: timeS / 1000) let when = DialogDateConverter().toString(date) diff --git a/Nynja/Services/MQTT/StarExtension+BERT.swift b/Nynja/Services/MQTT/StarExtension+BERT.swift index 8a5fed1ad..4be3b3996 100644 --- a/Nynja/Services/MQTT/StarExtension+BERT.swift +++ b/Nynja/Services/MQTT/StarExtension+BERT.swift @@ -12,14 +12,18 @@ extension Star { func getBert() -> BertObject { var result: BertObject = BertNil() let type = BertAtom(fromString: "Star") - let id = Bert.getBin(self.id) + var id: BertObject = BertNil() + if let idd = self.id { + id = BertNumber(fromInt64: idd) + } + let client_id = Bert.getBin(self.client_id) var rosterID: BertObject = BertNil() if let idd = roster_id { rosterID = BertNumber(fromInt64: idd) } let message = self.message?.getBert() ?? BertNil() let status = BertAtom(fromString:(self.status as? StringAtom)?.string ?? "") - result = BertTuple(fromElements: [type,id, rosterID, message, BertNil(),status]) + result = BertTuple(fromElements: [type, id, client_id,rosterID, message, BertNil(),status]) return result } } -- GitLab From 6b4fe83dda40645c3489abf8f2fdd346411b4c43 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 8 Feb 2018 19:18:21 +0200 Subject: [PATCH 2/6] Added ExtendedStar model. --- Nynja.xcodeproj/project.pbxproj | 8 ++++++++ Nynja/Library/Model/ExtendedStar.swift | 5 +++++ Nynja/Library/Source/Decoder.swift | 6 ++++++ Nynja/Library/Spec/ExtendedStar_Spec.swift | 7 +++++++ Nynja/Services/MQTT/MQTTService.swift | 2 +- 5 files changed, 27 insertions(+), 1 deletion(-) create mode 100644 Nynja/Library/Model/ExtendedStar.swift create mode 100644 Nynja/Library/Spec/ExtendedStar_Spec.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index aaad6f54d..1d13fce34 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -637,6 +637,8 @@ 78D088DF6A23DD7BAE665C9A /* AudioRecorderProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = D12785F11EFEC4A76CC34917 /* AudioRecorderProtocols.swift */; }; 7A8FE56A8E5D02256D8BE936 /* EditPhotoPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4177485419FF2E8F7CF8FF98 /* EditPhotoPresenter.swift */; }; 82FCF48AA4A8C04CC8B0B5B6 /* FavoritesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC0DFB96051C50F0FC5B9CA /* FavoritesWireframe.swift */; }; + 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; + 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; 858A72E5A4AE48CE24AFF649 /* MainInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70CEB31C47B0FEB0040FD0DA /* MainInteractor.swift */; }; 85F43C2BE9C631868C394BCD /* WebViewWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C469B351D6DA4CEBCE9C591 /* WebViewWireframe.swift */; }; 87A3D03524B9258B33726A57 /* HistoryInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E868EE32625048BCB13A8 /* HistoryInteractor.swift */; }; @@ -1473,6 +1475,8 @@ 8181D695D260804FB2F3102E /* ImagePreviewViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = ImagePreviewViewController.swift; sourceTree = ""; }; 83310EC1487B51C6F4FE9FB4 /* AudioRecorderInteractor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = AudioRecorderInteractor.swift; sourceTree = ""; }; 83894D517BFF22637F2878B7 /* EditUsernameProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameProtocols.swift; sourceTree = ""; }; + 855EF418202CB86500541BE3 /* ExtendedStar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar.swift; sourceTree = ""; }; + 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar_Spec.swift; sourceTree = ""; }; 8606C1D61AA46EB77821B1B0 /* MyGroupAliasProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MyGroupAliasProtocols.swift; sourceTree = ""; }; 8B2389EFD3432F86296722BE /* QRCodeGeneratorProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = QRCodeGeneratorProtocols.swift; sourceTree = ""; }; 8B772E08B9E40EB48DD87082 /* EditUsernameViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameViewController.swift; sourceTree = ""; }; @@ -2889,6 +2893,7 @@ 26035B421F9A73C700003850 /* Search_Spec.swift */, 26035B341F9A73C400003850 /* Service_Spec.swift */, 26035B4A1F9A73C900003850 /* Star_Spec.swift */, + 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */, 26035B4C1F9A73C900003850 /* Tag_Spec.swift */, 26035B2E1F9A73C300003850 /* Test_Spec.swift */, 26035B391F9A73C500003850 /* Typing_Spec.swift */, @@ -2949,6 +2954,7 @@ 26035B511F9A73D500003850 /* Search.swift */, 26035B6A1F9A73D700003850 /* Service.swift */, 26035B661F9A73D700003850 /* Star.swift */, + 855EF418202CB86500541BE3 /* ExtendedStar.swift */, 26035B671F9A73D700003850 /* Tag.swift */, 26035B541F9A73D500003850 /* Test.swift */, 26035B6C1F9A73D800003850 /* Typing.swift */, @@ -6143,6 +6149,7 @@ 267BE2941FDEA24000C47E18 /* SettingsGroupDS.swift in Sources */, 26035BA21F9A740A00003850 /* writer.swift in Sources */, F0839BACB1A52FCF846584D4 /* EditProfileWireframe.swift in Sources */, + 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */, 262DAFE51F9AB6FF00EB9C01 /* Profile.swift in Sources */, 26035B821F9A740A00003850 /* Desc.swift in Sources */, 6D86A47B1F4D168A00BBD7A2 /* BaseButton.swift in Sources */, @@ -6255,6 +6262,7 @@ 8ED0F3CD1FBC5CF2004916AB /* GroupsListProtocols.swift in Sources */, E7229A4A1F8CAD72003AEE04 /* TutorialViewControllerLayout.swift in Sources */, E70402BD1FF6972B00182D81 /* BaseView.swift in Sources */, + 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */, 4C5EEA13EBC6A8398F08DCD1 /* MainWireframe.swift in Sources */, 26035B8F1F9A740A00003850 /* Message.swift in Sources */, 8ECC067E1FC5BCC6002CF225 /* TransferManager.swift in Sources */, diff --git a/Nynja/Library/Model/ExtendedStar.swift b/Nynja/Library/Model/ExtendedStar.swift new file mode 100644 index 000000000..688970e64 --- /dev/null +++ b/Nynja/Library/Model/ExtendedStar.swift @@ -0,0 +1,5 @@ + +class ExtendedStar { + var star: Star? + var from: AnyObject? +} diff --git a/Nynja/Library/Source/Decoder.swift b/Nynja/Library/Source/Decoder.swift index c751963ae..6347b3863 100644 --- a/Nynja/Library/Source/Decoder.swift +++ b/Nynja/Library/Source/Decoder.swift @@ -297,6 +297,12 @@ func parseObject(name: String, body:[Model], tuple: BertTuple) -> AnyObject? a_Contact.presence = body[13].parse(bert: tuple.elements[14]) as? StringAtom a_Contact.status = body[14].parse(bert: tuple.elements[15]) as? AnyObject return a_Contact + case "ExtendedStar": + if body.count != 2 { return nil } + let a_ExtendedStar = ExtendedStar() + a_ExtendedStar.star = body[0].parse(bert: tuple.elements[1]) as? Star + a_ExtendedStar.from = body[1].parse(bert: tuple.elements[2]) as? AnyObject + return a_ExtendedStar case "Auth": if body.count != 13 { return nil } let a_Auth = Auth() diff --git a/Nynja/Library/Spec/ExtendedStar_Spec.swift b/Nynja/Library/Spec/ExtendedStar_Spec.swift new file mode 100644 index 000000000..6323c8cad --- /dev/null +++ b/Nynja/Library/Spec/ExtendedStar_Spec.swift @@ -0,0 +1,7 @@ + +func get_ExtendedStar() -> Model { + return Model(value:Tuple(name:"ExtendedStar",body:[ + get_Star(), + Model(value:Chain(types:[ + get_Contact(), + get_Room()]))]))} diff --git a/Nynja/Services/MQTT/MQTTService.swift b/Nynja/Services/MQTT/MQTTService.swift index 4859e1a64..b53eefcc9 100644 --- a/Nynja/Services/MQTT/MQTTService.swift +++ b/Nynja/Services/MQTT/MQTTService.swift @@ -22,7 +22,7 @@ class MQTTService: NSObject, CocoaMQTTDelegate, ReachabilityServiceObserver { static let version = 2 - var currentHost = host.DemoTemp + var currentHost = host.Test let port: UInt16 = 1883 var push: String? -- GitLab From 45198bfa25e96af8136ce9e99fec7168e3561b84 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 8 Feb 2018 19:20:57 +0200 Subject: [PATCH 3/6] Added ExtendedStar model to 'share' project target. --- Nynja.xcodeproj/project.pbxproj | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 1d13fce34..460b63d20 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -639,6 +639,8 @@ 82FCF48AA4A8C04CC8B0B5B6 /* FavoritesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC0DFB96051C50F0FC5B9CA /* FavoritesWireframe.swift */; }; 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; + 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; + 855EF41F202CBE2400541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; 858A72E5A4AE48CE24AFF649 /* MainInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70CEB31C47B0FEB0040FD0DA /* MainInteractor.swift */; }; 85F43C2BE9C631868C394BCD /* WebViewWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C469B351D6DA4CEBCE9C591 /* WebViewWireframe.swift */; }; 87A3D03524B9258B33726A57 /* HistoryInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E868EE32625048BCB13A8 /* HistoryInteractor.swift */; }; @@ -5540,6 +5542,7 @@ 35B1ABAA1FA34AD400E65233 /* ok2.swift in Sources */, 263D66351FE8DA9700A509F8 /* Typing_Spec.swift in Sources */, 264FFA951FC5912E0028243D /* Table.swift in Sources */, + 855EF41F202CBE2400541BE3 /* ExtendedStar.swift in Sources */, 26FF00A51FCC2EC4002170B1 /* MQTTServiceAuth.swift in Sources */, 35B1AB9B1FA3498000E65233 /* Member.swift in Sources */, 35B1ABA81FA34AB600E65233 /* io.swift in Sources */, @@ -5686,6 +5689,7 @@ 268C62E32008DA0900433705 /* UIImageExtensions.swift in Sources */, 264FFA961FC5913A0028243D /* ProfileTable.swift in Sources */, 359EB25D1F9A1EA500147437 /* (null) in Sources */, + 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */, 35B1AB951FA3491500E65233 /* Roster.swift in Sources */, 26770A551FFD2F91009AC870 /* StorageSubscriber.swift in Sources */, 35B1ABA71FA34A6B00E65233 /* error2_Spec.swift in Sources */, -- GitLab From 1ef90cb8ae43be8b05c68f0de3096f5697c47c3d Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Thu, 8 Feb 2018 19:48:02 +0200 Subject: [PATCH 4/6] Fixed migration of StarTable. --- Nynja/MigrationManager.swift | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/Nynja/MigrationManager.swift b/Nynja/MigrationManager.swift index d04ec7c07..03e8a40d7 100644 --- a/Nynja/MigrationManager.swift +++ b/Nynja/MigrationManager.swift @@ -113,15 +113,18 @@ class MigrationManager { } migrator.registerMigration(Migration.addStarMessageId.title) { db in + let tableName = StarTable.name + let clientIdColumn = StarTable.Column.clientId.title + + guard try !db.hasColumns([clientIdColumn], tableName: tableName) else { return } + let columnMapping = ColumnMapping([ - StarTable.Column.id.title: StarTable.Column.clientId.title + clientIdColumn: StarTable.Column.id.title ]) - let stars = try DBStar.fetchAll(db, "SELECT * FROM \(StarTable.name)", adapter: columnMapping) + let stars = try DBStar.fetchAll(db, "SELECT * FROM \(tableName)", adapter: columnMapping) try db.drop(index: StarTable.name) try StarTable().create(in: db) - try stars.forEach { star in - try star.saveAggregate(db) - } + try stars.forEach { try $0.saveAggregate(db) } } } -- GitLab From dbf109b301eb6700f6ef680b894a889c7eb61483 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Fri, 9 Feb 2018 16:58:27 +0200 Subject: [PATCH 5/6] Successfully received ExtendedStar models from the server. Make migration of DescTable: update primary key. --- Nynja.xcodeproj/project.pbxproj | 14 ++++ Nynja/DB/Models/DBStarMessage.swift | 64 +++++++++++----- Nynja/DB/Tables/DescTable.swift | 5 +- Nynja/ExtendedStarHandler.swift | 52 +++++++++++++ Nynja/GetExtendedStarsModel.swift | 28 +++++++ Nynja/Library/Spec/Star_Spec.swift | 1 - Nynja/MigrationManager.swift | 16 +++- .../Interactor/FavoritesInteractor.swift | 44 +++++++---- .../HandleServices/HandleService.swift | 74 +++++++++++++------ Nynja/Services/MQTT/MQTTServiceStars.swift | 19 +++++ Nynja/StorageService+Star.swift | 7 ++ 11 files changed, 262 insertions(+), 62 deletions(-) create mode 100644 Nynja/ExtendedStarHandler.swift create mode 100644 Nynja/GetExtendedStarsModel.swift create mode 100644 Nynja/Services/MQTT/MQTTServiceStars.swift diff --git a/Nynja.xcodeproj/project.pbxproj b/Nynja.xcodeproj/project.pbxproj index 460b63d20..d00e4a93f 100644 --- a/Nynja.xcodeproj/project.pbxproj +++ b/Nynja.xcodeproj/project.pbxproj @@ -637,10 +637,14 @@ 78D088DF6A23DD7BAE665C9A /* AudioRecorderProtocols.swift in Sources */ = {isa = PBXBuildFile; fileRef = D12785F11EFEC4A76CC34917 /* AudioRecorderProtocols.swift */; }; 7A8FE56A8E5D02256D8BE936 /* EditPhotoPresenter.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4177485419FF2E8F7CF8FF98 /* EditPhotoPresenter.swift */; }; 82FCF48AA4A8C04CC8B0B5B6 /* FavoritesWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6EC0DFB96051C50F0FC5B9CA /* FavoritesWireframe.swift */; }; + 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; 855EF419202CB86500541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; 855EF41B202CB9B900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; 855EF41E202CBE1900541BE3 /* ExtendedStar_Spec.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */; }; 855EF41F202CBE2400541BE3 /* ExtendedStar.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF418202CB86500541BE3 /* ExtendedStar.swift */; }; + 855EF421202CC6F800541BE3 /* GetExtendedStarsModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */; }; + 855EF423202CC85300541BE3 /* MQTTServiceStars.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */; }; + 855EF425202CCADB00541BE3 /* ExtendedStarHandler.swift in Sources */ = {isa = PBXBuildFile; fileRef = 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */; }; 858A72E5A4AE48CE24AFF649 /* MainInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 70CEB31C47B0FEB0040FD0DA /* MainInteractor.swift */; }; 85F43C2BE9C631868C394BCD /* WebViewWireframe.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1C469B351D6DA4CEBCE9C591 /* WebViewWireframe.swift */; }; 87A3D03524B9258B33726A57 /* HistoryInteractor.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5D3E868EE32625048BCB13A8 /* HistoryInteractor.swift */; }; @@ -1479,6 +1483,9 @@ 83894D517BFF22637F2878B7 /* EditUsernameProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameProtocols.swift; sourceTree = ""; }; 855EF418202CB86500541BE3 /* ExtendedStar.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar.swift; sourceTree = ""; }; 855EF41A202CB9B900541BE3 /* ExtendedStar_Spec.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStar_Spec.swift; sourceTree = ""; }; + 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GetExtendedStarsModel.swift; sourceTree = ""; }; + 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = MQTTServiceStars.swift; sourceTree = ""; }; + 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ExtendedStarHandler.swift; sourceTree = ""; }; 8606C1D61AA46EB77821B1B0 /* MyGroupAliasProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = MyGroupAliasProtocols.swift; sourceTree = ""; }; 8B2389EFD3432F86296722BE /* QRCodeGeneratorProtocols.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = QRCodeGeneratorProtocols.swift; sourceTree = ""; }; 8B772E08B9E40EB48DD87082 /* EditUsernameViewController.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; path = EditUsernameViewController.swift; sourceTree = ""; }; @@ -2710,6 +2717,7 @@ 260552A51F9E1CD100D68DE6 /* SearchHandler.swift */, 263D66321FE8D95100A509F8 /* TypingHandler.swift */, 26FA420F201821B400E6F6EC /* StarHandler.swift */, + 855EF424202CCADB00541BE3 /* ExtendedStarHandler.swift */, ); name = HandleServices; sourceTree = ""; @@ -2814,6 +2822,7 @@ 3A8045CE1F60C8E200AED866 /* MQTTServiceFriend.swift */, 3A8045CF1F60C8E200AED866 /* MQTTServiceProfile.swift */, 3A8045D01F60C8E200AED866 /* MQTTServiceAuth.swift */, + 855EF422202CC85300541BE3 /* MQTTServiceStars.swift */, ); name = MQTT; path = Services/MQTT; @@ -3047,6 +3056,7 @@ 265AEA161FE9AFD400AC4806 /* MemberModel.swift */, 263D662C1FE8D03400A509F8 /* TypingModel.swift */, 269848C9200E9F1300590D6F /* StarModels.swift */, + 855EF420202CC6F800541BE3 /* GetExtendedStarsModel.swift */, ); name = Models; sourceTree = ""; @@ -5698,6 +5708,7 @@ 35B1ABB51FA34C0C00E65233 /* Desc_Spec.swift in Sources */, 359EB2501F9A1DDC00147437 /* (null) in Sources */, 359EB25B1F9A1E9700147437 /* (null) in Sources */, + 850930A5202DC41300AC1C18 /* ExtendedStarHandler.swift in Sources */, 359EB27D1F9A2C9700147437 /* AuthModel.swift in Sources */, 359EB25E1F9A1EAD00147437 /* (null) in Sources */, ); @@ -5813,6 +5824,7 @@ E75D2CF62004ED84001E6718 /* MessageImageView.swift in Sources */, E7EDA5A21F8372EB00AE13F4 /* RosterExtension.swift in Sources */, 26A0B4291FA704B7009CD59A /* EditProfileWheelItemModel.swift in Sources */, + 855EF421202CC6F800541BE3 /* GetExtendedStarsModel.swift in Sources */, E7ABD2FF1FC2EDBC00E233F7 /* TagTable.swift in Sources */, 265AEA151FE9AFA700AC4806 /* MemberHandler.swift in Sources */, 26D268CE1FA7E3DB00F3BB23 /* CallsWheelItemModel.swift in Sources */, @@ -5822,6 +5834,7 @@ 26035B851F9A740A00003850 /* Feature.swift in Sources */, E75D2CFD2004ED84001E6718 /* MessageTableViewDelegate.swift in Sources */, 2661D12F1F373D1700F3E125 /* BoarderView.swift in Sources */, + 855EF425202CCADB00541BE3 /* ExtendedStarHandler.swift in Sources */, 3AC321781EEAC4C10068F3C8 /* AuthModel.swift in Sources */, 26D268C91FA7DD5C00F3BB23 /* MySelfWheelItemModel.swift in Sources */, 3A8218881EDF102D00337B05 /* Color.swift in Sources */, @@ -6421,6 +6434,7 @@ 990A25B2C84CE09B4CE64533 /* MyGroupAliasPresenter.swift in Sources */, D839883F9B7A8CD245A85701 /* MyGroupAliasInteractor.swift in Sources */, 8E96019F1FF303DF00E0C21D /* GroupAudiosListVC.swift in Sources */, + 855EF423202CC85300541BE3 /* MQTTServiceStars.swift in Sources */, 3362A56D731AC1411C02D037 /* MyGroupAliasWireframe.swift in Sources */, 8ED0F3D11FBC5CF2004916AB /* GroupsListViewController.swift in Sources */, BBF46945EB64E07C58817ACA /* EditGroupNameProtocols.swift in Sources */, diff --git a/Nynja/DB/Models/DBStarMessage.swift b/Nynja/DB/Models/DBStarMessage.swift index 8a679f0e8..438383a2a 100644 --- a/Nynja/DB/Models/DBStarMessage.swift +++ b/Nynja/DB/Models/DBStarMessage.swift @@ -118,6 +118,47 @@ class DBStarMessage: Record, DBModelProtocol { id = rowID } + // MARK: - Sender Info Setup + + func setup(contact: Contact) { + //self.feedName = contact.fullName + self.senderName = contact.nick ?? contact.fullName + self.senderAvatar = contact.avatar + } + + func setup(room: Room) { + self.feedName = room.name + if let sender = room.members?.first(where: { $0.phone_id == self.from }) { + setup(member: sender, room: room) + } + if let sender = room.admins?.first(where: { $0.phone_id == self.from }) { + setup(member: sender, room: room) + } + } + + private func setup(room: DBRoom) { + self.feedName = room.name + if let sender = room.members.first(where: { $0.phoneId == self.from }) { + let mem = Member(member: sender) + setup(member: mem, room: room) + } + if let sender = room.admins.first(where: { $0.phoneId == self.from }) { + let mem = Member(member: sender) + setup(member: mem, room: room) + } + } + + private func setup(member: Member, room: Room) { + self.senderName = member.alias ?? member.fullName + self.senderAvatar = room.data?.first?.payload + } + + private func setup(member: Member, room: DBRoom) { + self.senderName = member.alias ?? member.fullName + self.senderAvatar = room.files.first?.payload + } + + // MARK: - Query, Modification func saveAggregate(_ db: Database) throws { if let feed = self.feed { @@ -144,6 +185,7 @@ class DBStarMessage: Record, DBModelProtocol { } } + // MARK: - Fetching static func message(from db: Database, rowId: Int64) throws -> DBStarMessage? { @@ -232,9 +274,7 @@ class DBStarMessage: Record, DBModelProtocol { if let sender = try? DBContact.request(phoneId: from).fetchOne(db) { if let con = sender { let contact = Contact(contact: con) - //self.feedName = contact.fullName - self.senderName = contact.nick ?? contact.fullName - self.senderAvatar = contact.avatar + self.setup(contact: contact) } } } @@ -242,27 +282,11 @@ class DBStarMessage: Record, DBModelProtocol { self.feed = try DBMuc.fetchOne(db, key: feedId) if let f = feed as? DBMuc { if let room = try DBRoom.room(from: db, id: f.name) { - self.feedName = room.name - if let sender = room.members.filter({ (member) -> Bool in - member.phoneId == self.from - }).first { - let mem = Member(member: sender) - self.senderName = mem.alias ?? mem.fullName - self.senderAvatar = room.files.first?.payload - } - if let sender = room.admins.filter({ (member) -> Bool in - member.phoneId == self.from - }).first { - let mem = Member(member: sender) - self.senderName = mem.alias ?? mem.fullName - self.senderAvatar = room.files.first?.payload - } + setup(room: room) } } } } - - } func fetchId(_ db: Database) throws -> Int64? { diff --git a/Nynja/DB/Tables/DescTable.swift b/Nynja/DB/Tables/DescTable.swift index 2725ae2a8..061dbd24d 100644 --- a/Nynja/DB/Tables/DescTable.swift +++ b/Nynja/DB/Tables/DescTable.swift @@ -20,9 +20,8 @@ class DescTable: Table { func create(in db: Database, name: String) throws { try db.create(table: name, body: { (t) in - t.column(Column.id, .integer).notNull().primaryKey(onConflict: nil, autoincrement: true) + t.primaryKey([Column.serverId.title, Column.targetType.title], onConflict: nil) t.column(Column.serverId, .text).notNull() - t.uniqueKey([Column.serverId.title, Column.targetType.title], onConflict: .replace) t.column(Column.mime, .text) t.column(Column.payload, .text) t.column(Column.size, .integer).notNull().defaults(to: 0) @@ -32,7 +31,6 @@ class DescTable: Table { t.column(Column.targetType, .integer) }) } - } extension DescTable { @@ -48,5 +46,4 @@ extension DescTable { case targetId case targetType } - } diff --git a/Nynja/ExtendedStarHandler.swift b/Nynja/ExtendedStarHandler.swift new file mode 100644 index 000000000..a19363c74 --- /dev/null +++ b/Nynja/ExtendedStarHandler.swift @@ -0,0 +1,52 @@ +// +// ExtendedStarHandler.swift +// Nynja +// +// Created by Anton Poltoratskyi on 08.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +protocol ExtendedStarHandlerDelegate: class { + func didReceiveStars(_ stars: [Star]) +} + +final class ExtendedStarHandler: BaseHandler { + + static weak var delegate: ExtendedStarHandlerDelegate? + + static func executeHandle(data: BertList) { + let extendedStars = data.elements.flatMap { get_ExtendedStar().parse(bert: $0) as? ExtendedStar } + + let stars = extendedStars.flatMap { extendedStar -> Star? in + #if !SHARE_EXTENSION + guard let star = extendedStar.star, let dbStar = DBStar(star: star) else { return nil } + + if let feed = extendedStar.from { + switch feed { + case let feed as Contact: + dbStar.message?.setup(contact: feed) + case let feed as Room: + dbStar.message?.setup(room: feed) + default: + break + } + } + do { + let storage = StorageService.sharedInstance + if let dbStarMessage = dbStar.message, let messageId = try storage.fetchStarMessageId(of: dbStarMessage) { + dbStarMessage.id = messageId + } + try storage.perform(action: .save, with: dbStar) + } catch { } + + return Star(star: dbStar) + + #else + return extendedStar.star + #endif + } + delegate?.didReceiveStars(stars) + } +} diff --git a/Nynja/GetExtendedStarsModel.swift b/Nynja/GetExtendedStarsModel.swift new file mode 100644 index 000000000..eb8478004 --- /dev/null +++ b/Nynja/GetExtendedStarsModel.swift @@ -0,0 +1,28 @@ +// +// GetExtendedStarsModel.swift +// Nynja +// +// Created by Anton Poltoratskyi on 08.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation +import CocoaMQTT + +class GetExtendedStarsModel: BaseMQTTModel { + + override func getBert() -> [UInt8] { + let topic = BertAtom(fromString: "ExtendedStar") + + let model = BertTuple(fromElements: [topic, BertNil(), BertNil()]) + var result = [UInt8]() + do { + let bytes = try Bert.encode(object: model) + result = [UInt8](repeating: 0, count: bytes.length) + bytes.getBytes(&result, length: bytes.length) + return result + } catch { + return result + } + } +} diff --git a/Nynja/Library/Spec/Star_Spec.swift b/Nynja/Library/Spec/Star_Spec.swift index b2acb5fa1..99b0ad972 100644 --- a/Nynja/Library/Spec/Star_Spec.swift +++ b/Nynja/Library/Spec/Star_Spec.swift @@ -15,4 +15,3 @@ func get_Star() -> Model { Model(value:List(constant:"")), Model(value:Atom(constant:"add")), Model(value:Atom(constant:"remove"))]))]))} - diff --git a/Nynja/MigrationManager.swift b/Nynja/MigrationManager.swift index 03e8a40d7..85ac2e97c 100644 --- a/Nynja/MigrationManager.swift +++ b/Nynja/MigrationManager.swift @@ -17,6 +17,7 @@ enum Migration: Describable { case updateChatCheckpoint case addCreatedToContact case addStarMessageId + case dropDescAutoincrementPrimaryKeyAndSetCompountKey } class MigrationManager { @@ -122,10 +123,21 @@ class MigrationManager { clientIdColumn: StarTable.Column.id.title ]) let stars = try DBStar.fetchAll(db, "SELECT * FROM \(tableName)", adapter: columnMapping) - try db.drop(index: StarTable.name) + try db.drop(table: tableName) try StarTable().create(in: db) try stars.forEach { try $0.saveAggregate(db) } } + + migrator.registerMigration(Migration.dropDescAutoincrementPrimaryKeyAndSetCompountKey.title) { db in + let tableName = DescTable.name + let oldPrimaryKey = StarTable.Column.id.title + + guard try db.hasColumns([oldPrimaryKey], tableName: tableName) else { return } + + let descs = try DBDesc.fetchAll(db) + try db.drop(table: tableName) + try DescTable().create(in: db) + try descs.forEach { try $0.saveAggregate(db) } + } } - } diff --git a/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift b/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift index 1b14f8065..4f3ad977e 100644 --- a/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift +++ b/Nynja/Modules/Favorites/Interactor/FavoritesInteractor.swift @@ -6,23 +6,15 @@ // Copyright © 2017 TecSynt Solutions. All rights reserved. // -class FavoritesInteractor: FavoritesInteractorInputProtocol, StarHandlerDelegate { +class FavoritesInteractor: FavoritesInteractorInputProtocol, StarHandlerDelegate, ExtendedStarHandlerDelegate { weak var presenter: FavoritesInteractorOutputProtocol! func getStars() { StarHandler.delegate = self - if let id = (StorageService.sharedInstance.profile.rosters?.first as? Roster)?.id { - - let stars = try? StorageService.sharedInstance.fetchStars(rosterID: id).values.sorted(by: { (left, right) -> Bool in - let id1 = left.client_id?.split(separator: "_").last ?? "" - let id2 = right.client_id?.split(separator: "_").last ?? "" - return id1 > id2 - }) - if stars != nil { - self.presenter.getStarsSuccess(stars: stars!) - } - } + ExtendedStarHandler.delegate = self + + MQTTService.sharedInstance.getFavorites() } func getRoomOrContact(message: Message) -> AnyObject? { @@ -32,10 +24,34 @@ class FavoritesInteractor: FavoritesInteractorInputProtocol, StarHandlerDelegate return nil } + // MARK: - Local Storage + + private func fetchStars() { + guard let rosterId = StorageService.sharedInstance.rosterId else { return } + + let stars = try? StorageService.sharedInstance.fetchStars(rosterID: rosterId).values.sorted(by: { (left, right) -> Bool in + let id1 = left.client_id?.split(separator: "_").last ?? "" + let id2 = right.client_id?.split(separator: "_").last ?? "" + return id1 > id2 + }) + if stars != nil { + self.presenter.getStarsSuccess(stars: stars!) + } + } + + // MARK: - StarHandlerDelegate + func newStar(star: Star) { - self.getStars() + self.fetchStars() } + func removeStar(star: Star) { - self.getStars() + self.fetchStars() + } + + // MARK: - ExtendedStarHandlerDelegate + + func didReceiveStars(_ stars: [Star]) { + self.fetchStars() } } diff --git a/Nynja/Services/HandleServices/HandleService.swift b/Nynja/Services/HandleServices/HandleService.swift index 9251773eb..4712371a5 100644 --- a/Nynja/Services/HandleServices/HandleService.swift +++ b/Nynja/Services/HandleServices/HandleService.swift @@ -11,6 +11,11 @@ import CocoaMQTT protocol BaseHandler { static func executeHandle(data: BertTuple) + static func executeHandle(data: BertList) +} +extension BaseHandler { + static func executeHandle(data: BertTuple) { } + static func executeHandle(data: BertList) { } } enum Handlers : String { @@ -25,6 +30,7 @@ enum Handlers : String { case member case typing case star + case extendedStar = "extendedstar" } class HandlerService { @@ -33,31 +39,26 @@ class HandlerService { let data = NSData(bytes: response.payload, length: response.payload.count) do { let result = try Bert.decode(data:data) - if let tuple = result as? BertTuple { - parseClass(tuple: tuple) - } - if let resultArray = result as? BertList { - if resultArray.elements.count > 0 { - if let tuple = resultArray.elements[0] as? BertTuple { - parseClass(tuple: tuple) - } - } + switch result { + case let result as BertTuple: + guard let handler = handler(of: result) else { return } + executeHandle(handler: handler, params: result) + + case let result as BertList where !result.elements.isEmpty: + guard let tuple = result.elements[0] as? BertTuple, let handler = handler(of: tuple) else { return } + executeHandle(handler: handler, params: result) + + default: + break } - } catch { - - } + } catch { } } - static func parseClass(tuple: BertTuple) { - if tuple.elements.count > 0 { - if let header = tuple.elements[0] as? BertAtom { - if let handle = Handlers(rawValue: header.value.lowercased()) { - executeHandle(handler: handle, params: tuple) - } else { - // assertionFailure("Handle Not Found") - } - } + static func handler(of tuple: BertTuple) -> Handlers? { + guard !tuple.elements.isEmpty, let header = tuple.elements[0] as? BertAtom else { + return nil } + return Handlers(rawValue: header.value.lowercased()) } static func executeHandle(handler: Handlers, params: BertTuple) { @@ -84,6 +85,37 @@ class HandlerService { TypingHandler.executeHandle(data: params) case .star: StarHandler.executeHandle(data: params) + case .extendedStar: + ExtendedStarHandler.executeHandle(data: params) + } + } + + static func executeHandle(handler: Handlers, params: BertList) { + switch handler { + case .io: + IoHandler.executeHandle(data:params) + case .profile: + ProfileHandler.executeHandle(data: params) + case .roster: + RosterHandler.executeHandle(data: params) + case .contact: + ContactHandler.executeHandle(data: params) + case .history: + HistoryHandler.executeHandle(data: params) + case .message: + MessageHandler.executeHandle(data: params) + case .search: + SearchHandler.executeHandle(data: params) + case .room: + RoomHandler.executeHandle(data: params) + case .member: + MemberHandler.executeHandle(data: params) + case .typing: + TypingHandler.executeHandle(data: params) + case .star: + StarHandler.executeHandle(data: params) + case .extendedStar: + ExtendedStarHandler.executeHandle(data: params) } } } diff --git a/Nynja/Services/MQTT/MQTTServiceStars.swift b/Nynja/Services/MQTT/MQTTServiceStars.swift new file mode 100644 index 000000000..25671f4f5 --- /dev/null +++ b/Nynja/Services/MQTT/MQTTServiceStars.swift @@ -0,0 +1,19 @@ +// +// MQTTServiceStars.swift +// Nynja +// +// Created by Anton Poltoratskyi on 08.02.2018. +// Copyright © 2018 TecSynt Solutions. All rights reserved. +// + +import Foundation + +extension MQTTService { + func getFavorites() { + guard StorageService.sharedInstance.getToken() != nil else { + return + } + let model = GetExtendedStarsModel() + publish(model: model) + } +} diff --git a/Nynja/StorageService+Star.swift b/Nynja/StorageService+Star.swift index 84f93b6b1..1ecab7391 100644 --- a/Nynja/StorageService+Star.swift +++ b/Nynja/StorageService+Star.swift @@ -23,4 +23,11 @@ extension StorageService { return result } + func fetchStarMessageId(of message: DBStarMessage) throws -> Int64? { + var starMessageId: Int64? + try read { (db) in + starMessageId = try message.fetchId(db) + } + return starMessageId + } } -- GitLab From a616fc78bc4fc25f049bf8e23efd480d88d6ea94 Mon Sep 17 00:00:00 2001 From: Anton Poltoratskyi Date: Fri, 9 Feb 2018 17:04:33 +0200 Subject: [PATCH 6/6] Don't need to make additional fetch of DBStarMessage id. --- Nynja/ExtendedStarHandler.swift | 9 +-------- 1 file changed, 1 insertion(+), 8 deletions(-) diff --git a/Nynja/ExtendedStarHandler.swift b/Nynja/ExtendedStarHandler.swift index a19363c74..de8191b50 100644 --- a/Nynja/ExtendedStarHandler.swift +++ b/Nynja/ExtendedStarHandler.swift @@ -33,16 +33,9 @@ final class ExtendedStarHandler: BaseHandler { break } } - do { - let storage = StorageService.sharedInstance - if let dbStarMessage = dbStar.message, let messageId = try storage.fetchStarMessageId(of: dbStarMessage) { - dbStarMessage.id = messageId - } - try storage.perform(action: .save, with: dbStar) - } catch { } + try? StorageService.sharedInstance.perform(action: .save, with: dbStar) return Star(star: dbStar) - #else return extendedStar.star #endif -- GitLab