Skip to content

Commit

Permalink
Merge pull request #46 from Team-Shaka/temp-Develop
Browse files Browse the repository at this point in the history
2.0.0 Release
  • Loading branch information
Jeonhui committed Jan 4, 2024
2 parents 71b72f7 + 999c4fd commit 99190c8
Show file tree
Hide file tree
Showing 391 changed files with 40,965 additions and 5,602 deletions.
2 changes: 1 addition & 1 deletion Briefing-Widget/Utils/BriefingWidgetNetworkManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ final class BriefingWidgetNetworkManager {
}

extension BriefingWidgetNetworkManager {
func keywordsReqeuest(type: String = "KOREA",
func keywordsReqeuest(type: String = "SOCIAL",
date: Date = Date(),
timeoutInterval: TimeInterval = 10) -> URLRequest {

Expand Down
8 changes: 6 additions & 2 deletions Briefing-Widget/Widget/Briefing_Widget.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ struct Provider: TimelineProvider {
KeywordBriefing(id: rank,
ranks: rank,
title: "",
subTitle: "")
subTitle: "",
scrapCount: 0)
}

return Keywords(createdAt: createdAt,
// type: "SOCIAL",
briefings: briefings)
}()

Expand Down Expand Up @@ -237,9 +239,11 @@ struct Briefing_Widget: Widget {
KeywordBriefing(id: rank,
ranks: rank,
title: "\(rank) - Breifing",
subTitle: "")
subTitle: "",
scrapCount: 0)
}
return Keywords(createdAt: createdAt,
// type: "SOCIAL",
briefings: briefings)
}())
}
7 changes: 5 additions & 2 deletions Briefing-Widget/Widget/Briefing_Widget_Sub.swift
Original file line number Diff line number Diff line change
Expand Up @@ -16,10 +16,12 @@ struct SubProvider: TimelineProvider {
KeywordBriefing(id: rank,
ranks: rank,
title: "",
subTitle: "")
subTitle: "",
scrapCount: 0)
}

return Keywords(createdAt: createdAt,
// type: "SOCIAL",
briefings: briefings)
}()

Expand Down Expand Up @@ -122,9 +124,10 @@ struct Briefing_SubWidget: Widget {
KeywordBriefing(id: rank,
ranks: rank,
title: "\(rank) - Breifing",
subTitle: "")
subTitle: "", scrapCount: 0)
}
return Keywords(createdAt: createdAt,
// type: "SOCIAL",
briefings: briefings)
}())
}
92 changes: 74 additions & 18 deletions Briefing.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

114 changes: 112 additions & 2 deletions Briefing/Models/Network/Briefing/BriefingNetworkManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import Foundation
import Alamofire
import RxSwift

final class BriefingNetworkManager: BFNetworkManager {
static let shared: BriefingNetworkManager = BriefingNetworkManager()
Expand All @@ -16,7 +17,115 @@ final class BriefingNetworkManager: BFNetworkManager {
var member: Member?
}

// MARK: - functions for Briefing
// MARK: - rx functions for Briefing
extension BriefingNetworkManager {
func fetchKeywords(date: Date,
type: BriefingNetworkURLRequest.KeywordsType) -> Single<Keywords> {
let url = BriefingURLManager.url(key: .baseUrl)

// FIXME: - when release, should be changed
let morning = BriefingNetworkURLRequest.KeywordsType.morning

guard let urlRequest = BriefingNetworkURLRequest(member?.accessToken,
url: url,
method: .get,
path: .keywords,
query: [.date: date.dateToString(),
.type: type.rawValue,
.timeOfDay: morning.rawValue]) else {
return Single.error(BFNetworkError.wrongURLRequestError)
}
return response(urlRequest,
type: Keywords.self)
}

func fetchBriefingCard(id: Int) -> Single<BriefingData> {
let url = BriefingURLManager.url(key: .baseUrl)
guard let urlRequest = BriefingNetworkURLRequest(member?.accessToken,
url: url,
method: .get,
path: .briefingCard(id: id)) else {
return Single.error(BFNetworkError.wrongURLRequestError)
}

return response(urlRequest,
type: BriefingData.self)
}
}

// MARK: - rx functions for Scrap
extension BriefingNetworkManager {
func fetchScrapBrifings() -> Single<[(Date, [ScrapData])]> {
let url = BriefingURLManager.url(key: .baseUrl)
guard let memberId = BriefingAuthManager.shared.member?.memberId else {
return Single.error(BriefingNetworkError.noAuthError)
}

guard let urlRequest = BriefingNetworkURLRequest(member?.accessToken,
url: url,
method: .get,
path: .fetchScrap(memberId: memberId)) else {
return Single.error(BFNetworkError.wrongURLRequestError)
}

return response(urlRequest,
type: [ScrapData].self)
.map { scrapDatas in
scrapDatas.reduce(Dictionary<Date,[ScrapData]>(), { partialResult, scrapData in
var partialResult = partialResult
let date = scrapData.date.toDate(dataFormat:"yyyy-MM-dd") ?? Date()
partialResult[date, default: []].append(scrapData)
return partialResult
})
.map { return ($0, $1) }
.sorted(by: { $0.0 > $1.0 })
}
}

func scrapBriefing(id: Int) -> Single<ScrapResult> {
let url = BriefingURLManager.url(key: .baseUrl)
guard let memberId = BriefingAuthManager.shared.member?.memberId else {
return Single.error(BriefingNetworkError.noAuthError)
}
guard let urlRequest = BriefingNetworkURLRequest(member?.accessToken,
url: url,
method: .post,
path: .scrap,
httpBody: [.memberId: memberId,
.briefingId: id]) else {
return Single.error(BFNetworkError.wrongURLRequestError)
}

return response(urlRequest,
type: CreateScrapResult.self)
.map { $0 as ScrapResult }
}

func deleteScrapBriefing(id: Int) -> Single<ScrapResult> {
let url = BriefingURLManager.url(key: .baseUrl)
guard let memberId = BriefingAuthManager.shared.member?.memberId else {
return Single.error(BriefingNetworkError.noAuthError)
}

guard let urlRequest = BriefingNetworkURLRequest(member?.accessToken,
url: url,
method: .delete,
path: .deleteScrap(id: id, memberId: memberId)) else {
return Single.error(BFNetworkError.wrongURLRequestError)
}

return response(urlRequest,
type: DeleteScrapResult.self)
.map { $0 as ScrapResult }
}
}





// MARK: - ##### Legacy Code
// MARK: - (Legacy Code) functions for Briefing
extension BriefingNetworkManager {
func fetchKeywords(date: Date,
type: BriefingNetworkURLRequest.KeywordsType,
Expand Down Expand Up @@ -47,13 +156,14 @@ extension BriefingNetworkManager {
completion(nil, BFNetworkError.wrongURLRequestError)
return
}

response(urlRequest,
type: BriefingData.self,
completion: completion)
}
}

// MARK: - functions for Scrap
// MARK: - (Legacy Code) functions for Scrap
extension BriefingNetworkManager {

func fetchScrapBrifings(completion: @escaping (_ value: [(Date, [ScrapData])]?, _ error: Error?) -> Void) {
Expand Down
19 changes: 19 additions & 0 deletions Briefing/Models/Network/Briefing/BriefingNetworkURLRequest.swift
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,19 @@
import Foundation
import Alamofire

// MARK: - Category Mapping
extension BriefingCategory {
var keywordType: BriefingNetworkURLRequest.KeywordsType {
switch self {
case .social: return .social
case .science: return .science
case .global: return .global
case .economy: return .economy
}
}
}


// TODO: - POST
public struct BriefingNetworkURLRequest: BFURLRequest {
var accessToken: String?
Expand Down Expand Up @@ -40,6 +53,11 @@ extension BriefingNetworkURLRequest {
enum KeywordsType: String {
case korea = "KOREA"
case global = "GLOBAL"
case social = "SOCIAL"
case science = "SCIENCE"
case economy = "ECONOMY"
case morning = "Morning"
case Evening = "Evening"
}

enum Path: BFPath {
Expand Down Expand Up @@ -82,6 +100,7 @@ extension BriefingNetworkURLRequest {
enum QueryKey: String, BFQueryKey {
case date
case type
case timeOfDay
}

enum HTTPBodyKey: String, BFHTTPBodyKey {
Expand Down
69 changes: 64 additions & 5 deletions Briefing/Models/Network/protocols/BFNetworkManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,20 +7,26 @@

import Foundation
import Alamofire
import RxSwift

protocol BFNetworkManager {
func response<D: Codable>(_ briefingURLRequest: any BFURLRequest,
type: D.Type,
completion: @escaping (_ value: D?, _ error: Error?) -> Void)
type: D.Type,
completion: @escaping (_ value: D?, _ error: Error?) -> Void)

func response(_ briefingURLRequest: any BFURLRequest,
completion: @escaping (_ value: Data?, _ error: Error?) -> Void)

func response<D: Codable>(_ briefingURLRequest: any BFURLRequest,
type: D.Type) -> Single<D>

func response(_ briefingURLRequest: any BFURLRequest) -> Single<Data>
}

extension BFNetworkManager {
func response<D: Codable>(_ briefingURLRequest: any BFURLRequest,
type: D.Type,
completion: @escaping (_ value: D?, _ error: Error?) -> Void) {
type: D.Type,
completion: @escaping (_ value: D?, _ error: Error?) -> Void) {
AF.request(briefingURLRequest)
.responseDecodable(of: BriefingNetworkResult<D>.self) { response in
do {
Expand All @@ -47,7 +53,6 @@ extension BFNetworkManager {

completion(networkResult.result, response.error)
} catch {
print(#function, error)
completion(nil, error)
}
}
Expand All @@ -57,7 +62,61 @@ extension BFNetworkManager {
completion: @escaping (_ value: Data?, _ error: Error?) -> Void) {
AF.request(briefingURLRequest)
.responseData { response in

completion(response.value, response.error)
}
}

func response<D: Codable>(_ briefingURLRequest: any BFURLRequest,
type: D.Type) -> Single<D> {
Single.create { single in
AF.request(briefingURLRequest)
.responseDecodable(of: BriefingNetworkResult<D>.self) { response in
do {
if let statusCode = response.response?.statusCode {
switch statusCode {
case (200..<400): break
case (400): throw BFNetworkError.badRequestError
case (404): throw BFNetworkError.notFoundError
case (403): throw BFNetworkError.forbiddenError
case (500): throw BFNetworkError.internalServerError
default: break
}
}
guard let networkResult = response.value else {
throw response.error ?? BFNetworkError.notFoundError
}

guard networkResult.isSuccess else {
throw BFNetworkError.requestFail(code: networkResult.code,
message: networkResult.message)
}

guard let result = networkResult.result else {
throw BFNetworkError.notFoundError
}
single(.success(result))
} catch {
single(.failure(error))
}
}
return Disposables.create()
}
}

func response(_ briefingURLRequest: any BFURLRequest) -> Single<Data> {
Single.create { single in
AF.request(briefingURLRequest)
.responseData { response in
do {
if let error = response.error { throw error}
guard let value = response.value else { throw BFNetworkError.notFoundError }
single(.success(value))
} catch {
single(.failure(error))
}
}
return Disposables.create()
}
}
}
17 changes: 17 additions & 0 deletions Briefing/Models/Notification/BriefingNotificationManager.swift
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@

import Foundation
import UserNotifications
import RxSwift

class BriefingNotificationManager {
static let shared = BriefingNotificationManager()
Expand Down Expand Up @@ -54,6 +55,22 @@ class BriefingNotificationManager {
}
}
}

func isNotificationPermissionGranted() -> Single<Bool> {
Single.create { single in
self.notificationCenter.getNotificationSettings { (settings) in
switch settings.authorizationStatus {
case .authorized, .provisional, .ephemeral:
single(.success(true))
case .denied, .notDetermined:
single(.success(true))
@unknown default:
single(.success(true))
}
}
return Disposables.create()
}
}
}

extension UNNotificationRequest {
Expand Down
8 changes: 8 additions & 0 deletions Briefing/Models/Structure/BriefingData.swift
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,10 @@ struct BriefingData: Codable {
let isScrap: Bool
let isBriefingOpen: Bool?
let isWarning: Bool?
let scrapCount: Int
let gptModel: String
let timeOfDay: String
let type: String

enum CodingKeys: String, CodingKey {
case id
Expand All @@ -30,6 +34,10 @@ struct BriefingData: Codable {
case isScrap
case isBriefingOpen
case isWarning
case scrapCount
case gptModel
case timeOfDay
case type
}
}

Expand Down
Loading

0 comments on commit 99190c8

Please sign in to comment.