Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
19 commits
Select commit Hold shift + click to select a range
85b29f0
feat: Domain VO Equtable , sample 모델 ,Mapping 코드 추가
hyeonghwan Dec 14, 2023
ca8c0d4
feat: Submission Usecase 모듈화를 위한 public 추가 및 presentation 모델 -> VO 모델…
hyeonghwan Dec 14, 2023
8427f2d
feat: MO, VIewModel <-> Domain VO Mapping 코드 추가
hyeonghwan Dec 14, 2023
8bddf0c
refactor: 기존 Presentation layer 모델 domain모델로 변경
hyeonghwan Dec 14, 2023
ea210e2
refactor: GraphQL API DI 수정
hyeonghwan Dec 14, 2023
dc3eb98
chore: API 로그 , 주석 , module import 코드 추가
hyeonghwan Dec 14, 2023
fc9f85c
refactor: Repository Model -> VO 로 변경
hyeonghwan Dec 14, 2023
ec996e8
refaoctor: Core Data 메소드 인자 라벨 변경
hyeonghwan Dec 14, 2023
362e096
feat: 모듈화를 위한 repository pulic 코드 추가
hyeonghwan Dec 14, 2023
03cb4d6
feat: 기존 모델 삭제
hyeonghwan Dec 14, 2023
a7d9308
move: 제출 view-model 파일 이동
hyeonghwan Dec 14, 2023
984dab5
feat: GraphQL Fragment Model mapping 코드 추가
hyeonghwan Dec 14, 2023
35894d3
feat: vo -> View-model mapping코드 추가
hyeonghwan Dec 14, 2023
df42416
refactor: VO 변경 으로 인한 수정
hyeonghwan Dec 14, 2023
0b74151
refactor: 기존 mo <-> view-model mapping삭제
hyeonghwan Dec 14, 2023
a280899
refactor: submission Mo 맵핑 코드 삭제
hyeonghwan Dec 14, 2023
888ed77
refactor : Query Generator 코드, 파일 삭제
hyeonghwan Dec 14, 2023
5830f84
refactor: VO 변경 으로인한 수정
hyeonghwan Dec 14, 2023
8fac824
build: Core Data Model path 수정
hyeonghwan Dec 14, 2023
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Projects/CodestackApp/Project.swift
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ let resources: ResourceFileElements
"Resources/PLanguage/swift/*.txt",
"Resources/PLanguage/typescript/*.txt",
"Resources/Base.lproj/LaunchScreen.storyboard",
"Sources/Data/Repository/MO/db_model_v1.xcdatamodeld"
"Sources/Data/MO/db_model_v1.xcdatamodeld"
]


Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -39,7 +39,7 @@ class RichTextViewController: UIViewController{
}


static func create(with html: [Problem]) -> RichTextViewController{
static func create(with html: [ProblemVO]) -> RichTextViewController {
let vc = RichTextViewController()
let problems = html

Expand Down
9 changes: 6 additions & 3 deletions Projects/CodestackApp/Sources/DI/DataAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -12,10 +12,13 @@ import Data
public struct DataAssembly: Assembly {

public func assemble(container: Container) {

container.register(WebRepository.self) { resolver in
let tokenService = resolver.resolve(TokenAcquisitionService<RefreshToken>.self)!
return DefaultRepository(dependency: tokenService)
let graphAPI = resolver.resolve(GraphQLAPI.self)!
let restAPI = resolver.resolve(RestAPI.self)!
let token = resolver.resolve(TokenAcquisitionService<RefreshToken>.self)!
return DefaultRepository(dependency: .init(tokenAcquizition: token,
graphAPI: graphAPI,
restAPI: restAPI))
}.inObjectScope(.container)

container.register(DBRepository.self) { resolver in
Expand Down
7 changes: 7 additions & 0 deletions Projects/CodestackApp/Sources/DI/NetworkAssembly.swift
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,13 @@ public struct NetworkAssembly: Assembly {
extractToken: API.extractAccessToken)
}.inObjectScope(.container)


container.register(GraphQLAPI.self) { resolver in
let graphAPIDependency = DefaultGraphQLAPI.Dependency.init(baseURL: DefaultRepository.baseURL,
configuration: .default)
return DefaultGraphQLAPI(dependency: graphAPIDependency)
}

container.register(AppleLoginManager.self) { resolver in
let service = resolver.resolve(Auth.self)!
return AppleLoginManager(serviceManager: service)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,11 @@ import Foundation
import RxSwift

protocol DBRepository: AnyObject {
func fetch(_ requestType: SubmissionMO.RequestType) -> Single<[Submission]>
func store(submission: Submission) -> Single<Void>
func fetch(_ requestType: SubmissionMO.RequestType) -> Single<[SubmissionVO]>
func store(submission: SubmissionVO) -> Single<Void>
func remove() -> Single<Void>
func remove(_ requestType: SubmissionMO.RequestType) -> Completable
func update(submission: Submission, type request: SubmissionMO.RequestType) -> Single<Void>
func update(submission: SubmissionVO, type request: SubmissionMO.RequestType) -> Single<Void>

func fetchProblemState() -> Single<[ProblemSubmissionState]>
func fetchSubmissionCalendar() -> Single<[SubmissionCalendar]>
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ import CodestackAPI
import Apollo
import Data

protocol WebRepository: AnyObject {
public protocol WebRepository: AnyObject {

// MARK: GraphQL
// func getSolvedProblems(_ graph: GRAPH) -> Maybe<[ProblemIdentityFR]>
Expand All @@ -37,7 +37,7 @@ protocol WebRepository: AnyObject {
}


extension WebRepository {
public extension WebRepository {

private static var endpoint: String {
return Bundle.main.infoDictionary!["graphql_endpoint"] as! String
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -46,9 +46,9 @@ extension SubmissionCalendarMO : Identifiable {
let _submissions =
submissionSet
.toArray(of: SubmissionMO.self)
.compactMap { Submission(managedContext: $0) }
.compactMap { value in value.toDomain() }

return SubmissionCalendarVO(dates: _submissions.compactMap(\.createdAt))
return SubmissionCalendarVO(dates: _submissions.map(\.createdAt))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,17 @@ extension SubmissionMO : Identifiable {
}

extension SubmissionVO {
func updateMO(mo: SubmissionMO) -> SubmissionMO {
mo.codeContext?.code = self.sourceCode
mo.codeContext?.problemID = self.problem.id
mo.codeContext?.problemTitle = self.problem.title
mo.language?.languageID = self.language.id
mo.language?.name = self.language.name
mo.language?.extension = self.language.extension
mo.statusCode = self.statusCode
mo.createdAt = self.createdAt.toDateKST()
return mo
}
func toMO(in context: NSManagedObjectContext) -> SubmissionMO? {
guard
let submissionMO = SubmissionMO.insertNew(in: context),
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -24,7 +24,7 @@ extension FavoritProblemMO {
}
}

static func isEqualID(probelmID: ID) -> NSFetchRequest<FavoritProblemMO> {
static func isEqualID(probelmID: ProblemID) -> NSFetchRequest<FavoritProblemMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "problemID == %@", "\(probelmID)")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [ predicate1 ])
Expand Down
123 changes: 6 additions & 117 deletions Projects/CodestackApp/Sources/Data/Persistence/Models-extension.swift
Original file line number Diff line number Diff line change
Expand Up @@ -26,57 +26,6 @@ protocol MapperbleProtocol {
static func fetchRequest() -> NSFetchRequest<PersistenceType>
}

extension CodeContext: MapperbleProtocol {
typealias PersistenceType = CodeContextMO

static func fetchRequest() -> NSFetchRequest<CodeContextMO> {
CodeContextMO.fetchRequest()
}

@discardableResult
func store(in context: NSManagedObjectContext) -> CodeContextMO? {
let codeContextMO = CodeContextMO.insertNew(in: context)
codeContextMO?.code = self.code
codeContextMO?.problemID = self.problemID
codeContextMO?.problemTitle = self.problemTitle
return codeContextMO
}

init?(managedContext: CodeContextMO) {
self.init(code: managedContext.code,
problemID: managedContext.problemID,
problemTitle: managedContext.problemTitle)
}
}

extension Language: MapperbleProtocol {
typealias PersistenceType = LanguageMO

static func fetchRequest() -> NSFetchRequest<PersistenceType> {
LanguageMO.fetchRequest()
}

@discardableResult
func store(in context: NSManagedObjectContext) -> LanguageMO? {
let languageMO = LanguageMO.insertNew(in: context)
languageMO?.languageID = self.id
languageMO?.extension = self._extension
languageMO?.name = self.name
return languageMO
}

init?(managedContext: LanguageMO) {
guard
let id = managedContext.languageID,
let name = managedContext.name,
let `extension` = managedContext.extension
else {
return nil
}
self.init(id: id, name: name, _extension: `extension`)
}
}

extension FavoriteProblem: MapperbleProtocol {

func store(in context: NSManagedObjectContext) -> FavoritProblemMO? {
Expand Down Expand Up @@ -106,7 +55,7 @@ extension FavoriteProblem: MapperbleProtocol {
}

struct ProblemSubmissionState {
var submissions: [Submission]
var submissions: [SubmissionVO]
}

extension SubmissionCalendar: MapperbleProtocol {
Expand All @@ -119,9 +68,9 @@ extension SubmissionCalendar: MapperbleProtocol {
let _submissions =
submissionSet
.toArray(of: SubmissionMO.self)
.compactMap { Submission(managedContext: $0) }
.compactMap { $0.toDomain() }

self.dates = _submissions.compactMap(\.createdAt)
self.dates = _submissions.map(\.createdAt)
}

func store(in context: NSManagedObjectContext) -> SubmissionCalendarMO? {
Expand Down Expand Up @@ -149,77 +98,17 @@ extension ProblemSubmissionState: MapperbleProtocol {
let _submissions =
submissionSet
.toArray(of: SubmissionMO.self)
.compactMap { Submission(managedContext: $0) }
.compactMap { $0.toDomain() }
//.compactMap { Submission(managedContext: $0) }

self.submissions = _submissions
}

func store(in context: NSManagedObjectContext) -> ProblemSubmissionStateMO? {
guard let problemSubmissionMO = ProblemSubmissionStateMO.insertNew(in: context) else { return nil }

problemSubmissionMO.submissions = self.submissions.compactMap { $0.store(in: context) } as? NSSet
problemSubmissionMO.submissions = self.submissions.compactMap { $0.toMO(in:) } as? NSSet

return problemSubmissionMO
}
}

extension Submission: MapperbleProtocol {
typealias PersistenceType = SubmissionMO

static func fetchRequest() -> NSFetchRequest<PersistenceType> {
SubmissionMO.fetchRequest()
}

func store(in context: NSManagedObjectContext) -> SubmissionMO? {
guard
let submissionMO = SubmissionMO.insertNew(in: context),
let language = self.language,
let languageMO = language.store(in: context)
else {
return nil
}

let codeContext = CodeContext(code: self.sourceCode,
problemID: self.problem?.id,
problemTitle: self.problem?.title)
guard let codeContextMO = codeContext.store(in: context) else {
return nil }

submissionMO.createdAt = self.createdAt?.toDateKST()
submissionMO.id = self.id
submissionMO.statusCode = self.statusCode
submissionMO.codeContext = codeContextMO
submissionMO.language = languageMO

languageMO.submission = submissionMO
codeContextMO.submission = submissionMO

return submissionMO
}

init?(managedContext: SubmissionMO) {
guard
let id = managedContext.id,
let statusCode = managedContext.statusCode,
let createdAt = managedContext.createdAt,
let codeContextMO = managedContext.codeContext,
let codeContext = CodeContext(managedContext: codeContextMO),
let problemID = codeContext.problemID,
let problemTitle = codeContext.problemTitle,
let languageMO = managedContext.language,
let language = Language(managedContext: languageMO)
else {
return nil
}

self.init(id: id,
sourceCode: codeContext.code,
problem: Problem(id: problemID, title: problemTitle),
member: nil,
language: language,
cpuTime: nil,
memoryUsage: nil,
statusCode: statusCode,
createdAt: createdAt.toString())
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -15,8 +15,8 @@ extension SubmissionMO {
typealias LanguageName = String
enum RequestType {
case isExist(ProblemID)
case isNotTemp(ProblemID, String)
case isEqualStatusCode(String)
case isNotTemp(ProblemID, StatusCode)
case isEqualStatusCode(StatusCode)
case update(SubmissionID, ProblemID)
case recent(ProblemID)
case `default`
Expand Down Expand Up @@ -53,43 +53,43 @@ extension SubmissionMO {
}
}

static func recent(probelm id: ID) -> NSFetchRequest<SubmissionMO> {
static func recent(probelm id: ProblemID) -> NSFetchRequest<SubmissionMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "codeContext.problemID == %@", "\(id)")
let predicate1 = NSPredicate(format: "codeContext.problemID == %@", "\(String(describing: id))")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1])
request.fetchLimit = 1
request.sortDescriptors = [ NSSortDescriptor(key: "createdAt", ascending: false)]
return request
}

static func isEqualID(id: ID, _ probelmID: ID) -> NSFetchRequest<SubmissionMO> {
static func isEqualID(id: SubmissionID, _ probelmID: ProblemID) -> NSFetchRequest<SubmissionMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "id == %@", "\(id)")
let predicate2 = NSPredicate(format: "codeContext.problemID == %@", "\(probelmID)")
let predicate1 = NSPredicate(format: "id == %@", "\(String(describing: id))")
let predicate2 = NSPredicate(format: "codeContext.problemID == %@", "\(String(describing: probelmID))")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1, predicate2])
return request
}

static func isEqualStatusCode(_ statusCode: String) -> NSFetchRequest<SubmissionMO> {
static func isEqualStatusCode(_ statusCode: StatusCode) -> NSFetchRequest<SubmissionMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "statusCode == %@", "\(statusCode)")
request.predicate = predicate1
request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: false)]
return request
}

static func isNotTempSubmission(probelmID: ID, status: String) -> NSFetchRequest<SubmissionMO> {
static func isNotTempSubmission(probelmID: ProblemID, status: StatusCode) -> NSFetchRequest<SubmissionMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "statusCode != %@", "\(status)")
let predicate2 = NSPredicate(format: "codeContext.problemID == %@", "\(probelmID)")
let predicate2 = NSPredicate(format: "codeContext.problemID == %@", "\(String(describing: probelmID))")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1, predicate2])
request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: true)]
return request
}

static func isExistSubmission(problemID: ID) -> NSFetchRequest<SubmissionMO> {
static func isExistSubmission(problemID: ProblemID) -> NSFetchRequest<SubmissionMO> {
let request = newFetchRequest()
let predicate1 = NSPredicate(format: "codeContext.problemID == %@", "\(problemID)")
let predicate1 = NSPredicate(format: "codeContext.problemID == %@", "\(String(describing: problemID))")
request.predicate = NSCompoundPredicate(andPredicateWithSubpredicates: [predicate1])
request.sortDescriptors = [NSSortDescriptor(key: "createdAt", ascending: true)]
// request.fetchLimit = 1
Expand All @@ -107,15 +107,15 @@ extension SubmissionMO {
return request
}

func update(submission: Submission) -> Self {
self.codeContext?.code = submission.sourceCode
self.codeContext?.problemID = submission.problem?.id
self.codeContext?.problemTitle = submission.problem?.title
self.language?.languageID = submission.language?.id
self.language?.name = submission.language?.name
self.language?.extension = submission.language?._extension
self.statusCode = submission.statusCode
self.createdAt = submission.createdAt?.toDateKST()
return self
}
// func update(submission: Submission) -> Self {
// self.codeContext?.code = submission.sourceCode
// self.codeContext?.problemID = submission.problem?.id
// self.codeContext?.problemTitle = submission.problem?.title
// self.language?.languageID = submission.language?.id
// self.language?.name = submission.language?.name
// self.language?.extension = submission.language?._extension
// self.statusCode = submission.statusCode
// self.createdAt = submission.createdAt?.toDateKST()
// return self
// }
}
Loading