// // QuoteGroupStorageManager.swift // Quote // // Created by Torge Adelin on 24/06/2020. // Copyright © 2020 Torge Adelin. All rights reserved. // import Foundation import CoreData import UIKit let quoteGroupStorageManager = QuoteGroupStorageManager() class QuoteGroupStorageManager { let persistentContainer: NSPersistentContainer! //MARK: Init with dependency init(container: NSPersistentContainer) { self.persistentContainer = container self.persistentContainer.viewContext.automaticallyMergesChangesFromParent = true } convenience init() { // Use the default container for production environment guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { fatalError("Can not get shared app delegate") } self.init(container:appDelegate.persistentContainer) } lazy var backgroundContext: NSManagedObjectContext = { return self.persistentContainer.newBackgroundContext() }() func insertQuoteGroup(groupName: String, folderStyle: FolderStyle, folderIcon: String, dateCreated: Date, edit: Bool = false) -> QuoteGroup? { let currentQuoteGroups = fetch(with: groupName) if currentQuoteGroups.isEmpty { let newGroup = QuoteGroup(using: backgroundContext) newGroup.groupName = groupName newGroup.folderIcon = folderIcon newGroup.folderStyle = folderStyle.rawValue newGroup.dateCreated = dateCreated return newGroup } else { return nil } } func addQuoteToGroup(quoteID: String, quoteGroup: QuoteGroup) -> QuoteGroupItem? { let currentQuoteGroupItems = fetchQuoteItem(withID: quoteID, withQuoteGroup: quoteGroup) if currentQuoteGroupItems.isEmpty { let quoteItem = QuoteGroupItem(using: persistentContainer.viewContext) quoteItem.dateAdded = Date() quoteItem.quoteGroup = quoteGroup quoteItem.quoteID = quoteID try? persistentContainer.viewContext.save() return quoteItem } else { return nil } } func fetchQuoteItem(withID quoteID: String, withQuoteGroup quoteGroup: QuoteGroup) -> [QuoteGroupItem] { let context = persistentContainer.viewContext let fetchRequest = NSFetchRequest<QuoteGroupItem>(entityName: "QuoteGroupItem") let quoteIDPredicate = NSPredicate(format: "quoteID = %d", argumentArray: [quoteID]) let quoteGroupPredicate = NSPredicate(format: "quoteGroup = %d", argumentArray: [quoteGroup]) fetchRequest.predicate = NSCompoundPredicate(type: .and, subpredicates: [quoteIDPredicate, quoteGroupPredicate]) let result = try? context.fetch(fetchRequest) return result ?? [QuoteGroupItem]() } func fetch(with name: String) -> [QuoteGroup] { let context = persistentContainer.viewContext let fetchRequest = NSFetchRequest<QuoteGroup>(entityName: "QuoteGroup") fetchRequest.predicate = NSPredicate(format: "groupName = %d", argumentArray: [name]) let result = try? context.fetch(fetchRequest) return result ?? [QuoteGroup]() } func fetchAll() -> [QuoteGroup] { let context = persistentContainer.viewContext let fetchRequest = NSFetchRequest<QuoteGroup>(entityName: "QuoteGroup") let result = try? context.fetch(fetchRequest) return result ?? [QuoteGroup]() } func editQuoteGroup(quoteGroup: QuoteGroup, newGroupName: String, newFolderIcon: String, newFolderStyle: FolderStyle) -> QuoteGroup? { let currentQuoteGroups = fetch(with: newGroupName) if currentQuoteGroups.isEmpty { quoteGroup.setValue(newGroupName, forKey: "groupName") quoteGroup.setValue(newFolderIcon, forKey: "folderIcon") quoteGroup.setValue(newFolderStyle.rawValue, forKey: "folderStyle") return quoteGroup } else { return nil } } // Remove a search term func remove(objectID: NSManagedObjectID ) { let obj = backgroundContext.object(with: objectID) backgroundContext.delete(obj) } func save() { if backgroundContext.hasChanges { do { try backgroundContext.save() } catch { print("Save error \(error)") } } } }