Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
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
531 changes: 529 additions & 2 deletions SniffMeet/SniffMeet.xcodeproj/project.pbxproj

Large diffs are not rendered by default.

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
LastUpgradeVersion = "1640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
LastUpgradeVersion = "1640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="UTF-8"?>
<Scheme
LastUpgradeVersion = "1600"
LastUpgradeVersion = "1640"
version = "1.7">
<BuildAction
parallelizeBuildables = "YES"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// HasData.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol HasData {
var data: Data? { get set }
func setData(_ data: Data) -> Self
}
extension HasData {
func setData(_ data: Data) -> Self {
var copy = self
copy.data = data
return copy
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
//
// HasQuery.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol HasQuery {
var query: [String: String] { get set }
func setQuery(_ parameter: SupabaseQueryParameter) -> Self
}
extension HasQuery {
func setQuery(_ parameter: SupabaseQueryParameter) -> Self {
var copy = self
copy.query[parameter.key] = parameter.value
return copy
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// SupabaseDBDeleteRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol RemoteDBDeleteRequestBuildable: RemoteDBRequestBuildable & HasQuery {
func setQuery(_ parameter: SupabaseQueryParameter) -> Self
@discardableResult func request() async throws -> Data
}

final class SupabaseDBDeleteRequestBuilder: SupabaseDBRequestBuilder, RemoteDBDeleteRequestBuildable {
var query: [String: String] = [:]

func request() async throws -> Data {
guard let table else { throw SupabaseDBError.deleteDataFailed }
let request = SupabaseDBRequest.deleteData(
table: table,
accessToken: accessToken,
query: query
)
return try await networkProvider.request(with: request).data
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// SupabaseDBFetchRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol RemoteDBFetchRequestBuildable: RemoteDBRequestBuildable & HasQuery {
func setQuery(_ parameter: SupabaseQueryParameter) -> Self
func request() async throws -> Data
}

final class SupabaseDBFetchRequestBuilder: SupabaseDBRequestBuilder, RemoteDBFetchRequestBuildable {
var query: [String: String] = [:]

func request() async throws -> Data {
guard let table else { throw SupabaseDBError.fetchDataFailed }
let request = SupabaseDBRequest.fetchData(
table: table,
accessToken: accessToken,
query: query
)
return try await networkProvider.request(with: request).data
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
//
// SupabaseDBInsertRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol RemoteDBInsertRequestBuildable: RemoteDBRequestBuildable & HasData {
func setData(_ data: Data) -> Self
@discardableResult func request() async throws -> Data
}

final class SupabaseDBInsertRequestBuilder: SupabaseDBRequestBuilder, RemoteDBInsertRequestBuildable {
var data: Data?

func request() async throws -> Data {
guard let data, let table else { throw SupabaseDBError.insertDataFailed }
let request = SupabaseDBRequest.insertData(
table: table,
accessToken: accessToken,
data: data
)
return try await networkProvider.request(with: request).data
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// SupabaseDBRPCRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol RemoteDBRPCRequestBuildable: RemoteDBRequestBuildable & HasQuery & HasData {
func setQuery(_ parameter: SupabaseQueryParameter) -> Self
func setData(_ data: Data) -> Self
func request() async throws -> Data
}

final class SupabaseDBRPCRequestBuilder: SupabaseDBRequestBuilder, RemoteDBRPCRequestBuildable {
var data: Data?
var query: [String: String] = [:]

func request() async throws -> Data {
guard let data, let table else { throw SupabaseDBError.rpcFailed }
let request = SupabaseDBRequest.rpc(
table: table,
accessToken: accessToken,
data: data,
query: query
)
return try await networkProvider.request(with: request).data
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,36 @@
//
// SupabaseDBRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 2/6/25.
//

import Foundation

enum SupabaseDBTask {
case fetch
case insert
case update
case delete
case rpc
}

protocol RemoteDBRequestBuildable {
func setTable(_ table: String) -> Self
}

class SupabaseDBRequestBuilder {
let networkProvider: any NetworkProvider
let accessToken: String?
var table: String?

init(networkProvider: any NetworkProvider, accessToken: String?) {
self.networkProvider = networkProvider
self.accessToken = accessToken
}

func setTable(_ table: String) -> Self {
self.table = table
return self
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
//
// SupabaseDBUpdateRequestBuilder.swift
// SniffMeet
//
// Created by Kelly Chui on 6/28/25.
//

import Foundation

protocol RemoteDBUpdateRequestBuildable: RemoteDBRequestBuildable & HasQuery & HasData {
func setQuery(_ parameter: SupabaseQueryParameter) -> Self
func setData(_ data: Data) -> Self
@discardableResult func request() async throws -> Data
}

final class SupabaseDBUpdateRequestBuilder: SupabaseDBRequestBuilder, RemoteDBUpdateRequestBuildable {
var data: Data?
var query: [String: String] = [:]

func request() async throws -> Data {
guard let data, let table else { throw SupabaseDBError.updateDataFailed }
let request = SupabaseDBRequest.updateData(
table: table,
accessToken: accessToken,
data: data,
query: query
)
return try await networkProvider.request(with: request).data
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,11 @@ import Combine
import Foundation

protocol RemoteDBManageable {
func fetchData() async throws -> RemoteDBRequestBuildable
func insertData() async throws -> RemoteDBRequestBuildable
func updateData() async throws -> RemoteDBRequestBuildable
func deleteData() async throws -> RemoteDBRequestBuildable
func rpc() async throws -> RemoteDBRequestBuildable
func fetchData() async throws -> any RemoteDBFetchRequestBuildable
func insertData() async throws -> any RemoteDBInsertRequestBuildable
func updateData() async throws -> any RemoteDBUpdateRequestBuildable
func deleteData() async throws -> any RemoteDBDeleteRequestBuildable
func rpc() async throws -> any RemoteDBRPCRequestBuildable
}

final class SupabaseDBManager: RemoteDBManageable {
Expand All @@ -27,53 +27,48 @@ final class SupabaseDBManager: RemoteDBManageable {
self.jsonDecoder = JSONDecoder()
}

func fetchData() async throws -> RemoteDBRequestBuildable {
func fetchData() async throws -> any RemoteDBFetchRequestBuildable {
let accessToken = try sessionManager.accessToken.get()
try await sessionManager.checkSession()
return SupabaseDBRequestBuilder(
return SupabaseDBFetchRequestBuilder(
networkProvider: networkProvider,
accessToken: accessToken,
task: .fetch
accessToken: accessToken
)
}

func insertData() async throws -> RemoteDBRequestBuildable {
func insertData() async throws -> any RemoteDBInsertRequestBuildable {
let accessToken = try sessionManager.accessToken.get()
try await sessionManager.checkSession()
return SupabaseDBRequestBuilder(
return SupabaseDBInsertRequestBuilder(
networkProvider: networkProvider,
accessToken: accessToken,
task: .insert
accessToken: accessToken
)
}

func updateData() async throws -> RemoteDBRequestBuildable {
func updateData() async throws -> any RemoteDBUpdateRequestBuildable {
let accessToken = try sessionManager.accessToken.get()
try await sessionManager.checkSession()
return SupabaseDBRequestBuilder(
return SupabaseDBUpdateRequestBuilder(
networkProvider: networkProvider,
accessToken: accessToken,
task: .update
accessToken: accessToken
)
}

func deleteData() async throws -> RemoteDBRequestBuildable {
func deleteData() async throws -> any RemoteDBDeleteRequestBuildable {
let accessToken = try sessionManager.accessToken.get()
try await sessionManager.checkSession()
return SupabaseDBRequestBuilder(
return SupabaseDBDeleteRequestBuilder(
networkProvider: networkProvider,
accessToken: accessToken,
task: .delete
accessToken: accessToken
)
}

func rpc() async throws -> RemoteDBRequestBuildable {
func rpc() async throws -> any RemoteDBRPCRequestBuildable {
let accessToken = try sessionManager.accessToken.get()
try await sessionManager.checkSession()
return SupabaseDBRequestBuilder(
return SupabaseDBRPCRequestBuilder(
networkProvider: networkProvider,
accessToken: accessToken,
task: .rpc
accessToken: accessToken
)
}
}
Expand Down
Loading