195 lines
8.3 KiB
Swift
195 lines
8.3 KiB
Swift
//
|
||
// PLJobManager.swift
|
||
// IOS_study
|
||
//
|
||
// Created by CC-star on 2025/7/2.
|
||
//
|
||
|
||
import Foundation
|
||
import LeanCloud
|
||
|
||
final class PLJobManager {
|
||
//单例模式
|
||
static var shared = PLJobManager()
|
||
private init() {}
|
||
private let className = "PLJob"
|
||
// //仅供学习
|
||
// func findJobs() async throws -> [PLJob] {
|
||
// let query = LCQuery(className: className)
|
||
// query.whereKey(PLJob.CodingKeys.isActive.rawValue,.equalTo(true))//equalTo -> =
|
||
// query.whereKey("updatedAt", .descending)//降序
|
||
//
|
||
// return try await query.find(as: PLJob.self)
|
||
// }
|
||
// MARK: - 取出所有工作
|
||
func findJobsByREST(limit: Int, skip: Int, filter: PLFilter, order: PLOrder) async throws -> [PLJob] {
|
||
// let urlStr = """
|
||
// \(kServerURLStr)/1.1/classes/\(className)?where={\(PLJob.CodingKeys.isActive.rawValue): true }&order=-updatedAt
|
||
// """
|
||
var components = URLComponents(string: "\(kServerURLStr)/1.1/classes/\(className)")!
|
||
|
||
//筛选
|
||
var whereDic: [String: Any] = [PLJob.CodingKeys.isActive.rawValue: true]
|
||
if let business = filter.business {//按行业筛选
|
||
whereDic[PLJob.CodingKeys.business.rawValue] = business
|
||
}
|
||
if let city = filter.city {//按城市筛选
|
||
whereDic[PLJob.CodingKeys.city.rawValue] = city
|
||
}
|
||
//转换为字符串
|
||
let whereData = try JSONSerialization.data(withJSONObject: whereDic)
|
||
guard let whereStr = String(data: whereData, encoding: .utf8) else { throw URLError(.badURL) }
|
||
|
||
//排序
|
||
var orderStr = ""
|
||
switch order {
|
||
case .updatedAt:
|
||
orderStr = "-updatedAt"
|
||
case .hourlywage:
|
||
orderStr = "-hourlywage"
|
||
}
|
||
|
||
components.queryItems = [
|
||
URLQueryItem(name: "where", value: whereStr),
|
||
URLQueryItem(name: "order", value: orderStr),
|
||
URLQueryItem(name: "limit", value: "\(limit)"),
|
||
URLQueryItem(name: "skip", value: "\(skip)")
|
||
]
|
||
guard let urlstr = components.url?.absoluteString else { throw URLError(.badURL) }
|
||
|
||
return try await RESTManager.shared.find(form: urlstr)
|
||
}
|
||
// MARK: - 取出我发布的工作
|
||
func findJobsByREST(by userID: String, limit: Int, skip: Int) async throws -> [PLJob] {
|
||
var components = URLComponents(string: "\(kServerURLStr)/1.1/classes/\(className)")!
|
||
|
||
//基础条件
|
||
let whereDic: [String: Any] = [PLJob.CodingKeys.userID.rawValue: userID]
|
||
|
||
//转换为字符串
|
||
let whereData = try JSONSerialization.data(withJSONObject: whereDic)
|
||
guard let whereStr = String(data: whereData, encoding: .utf8) else { throw URLError(.badURL) }
|
||
|
||
//添加查询参数
|
||
components.queryItems = [
|
||
URLQueryItem(name: "where", value: whereStr),
|
||
URLQueryItem(name: "order", value: "-updatedAt"),
|
||
URLQueryItem(name: "limit", value: "\(limit)"),
|
||
URLQueryItem(name: "skip", value: "\(skip)")
|
||
]
|
||
guard let urlstr = components.url?.absoluteString else { throw URLError(.badURL) }
|
||
|
||
return try await RESTManager.shared.find(form: urlstr)
|
||
}
|
||
// MARK: - 取出job数量【已上线/全部】
|
||
func findJobsCount(by userID: String, onlyActive: Bool = false) async -> Int {
|
||
let query = LCQuery(className: className)
|
||
query.whereKey(PLJob.CodingKeys.userID.rawValue, .equalTo(userID))
|
||
if onlyActive { query.whereKey(PLJob.CodingKeys.isActive.rawValue, .equalTo(true)) }
|
||
return (try? await query.count()) ?? 0
|
||
}
|
||
|
||
func save(job: PLJob, isEditing: Bool = false) async throws {
|
||
// 构建对象
|
||
var lcObject = LCObject(className: "PLJob")
|
||
|
||
if isEditing {
|
||
let query = LCQuery(className: className)
|
||
query.whereKey("id", .equalTo(job.id))
|
||
lcObject = try await query.getFirst()
|
||
}
|
||
|
||
// 为属性赋值
|
||
try lcObject.set(PLJob.CodingKeys.id.rawValue, value: job.id)
|
||
try lcObject.set(PLJob.CodingKeys.isActive.rawValue, value: job.isActive)
|
||
try lcObject.set(PLJob.CodingKeys.title.rawValue, value: job.title)
|
||
try lcObject.set(PLJob.CodingKeys.business.rawValue, value: job.business)
|
||
try lcObject.set(PLJob.CodingKeys.tax.rawValue, value: job.tax)
|
||
try lcObject.set(PLJob.CodingKeys.hourlyWage.rawValue, value: job.hourlyWage)
|
||
try lcObject.set(PLJob.CodingKeys.wantNum.rawValue, value: job.wantNum)
|
||
try lcObject.set(PLJob.CodingKeys.contactType.rawValue, value: job.contactType)
|
||
try lcObject.set(PLJob.CodingKeys.contact.rawValue, value: job.contact)
|
||
|
||
//工作时间
|
||
try lcObject.set(PLJob.CodingKeys.startHour.rawValue, value: job.startHour)
|
||
try lcObject.set(PLJob.CodingKeys.startMin.rawValue, value: job.startMin)
|
||
try lcObject.set(PLJob.CodingKeys.endHour.rawValue, value: job.endHour)
|
||
try lcObject.set(PLJob.CodingKeys.endMin.rawValue, value: job.endMin)
|
||
try lcObject.set(PLJob.CodingKeys.has2.rawValue, value: job.has2)
|
||
try lcObject.set(PLJob.CodingKeys.startHour2.rawValue, value: job.startHour2)
|
||
try lcObject.set(PLJob.CodingKeys.startMin2.rawValue, value: job.startMin2)
|
||
try lcObject.set(PLJob.CodingKeys.endHour2.rawValue, value: job.endHour2)
|
||
try lcObject.set(PLJob.CodingKeys.endMin2.rawValue, value: job.endMin2)
|
||
try lcObject.set(PLJob.CodingKeys.otherTime.rawValue, value: job.otherTime)
|
||
|
||
//工作地点
|
||
try lcObject.set(PLJob.CodingKeys.placeName.rawValue, value: job.placeName)
|
||
try lcObject.set(PLJob.CodingKeys.province.rawValue, value: job.province)
|
||
try lcObject.set(PLJob.CodingKeys.city.rawValue, value: job.city)
|
||
try lcObject.set(PLJob.CodingKeys.workContent.rawValue, value: job.workContent)
|
||
|
||
//要求
|
||
try lcObject.set(PLJob.CodingKeys.needExp.rawValue, value: job.needExp)
|
||
try lcObject.set(PLJob.CodingKeys.needEdu.rawValue, value: job.needEdu)
|
||
try lcObject.set(PLJob.CodingKeys.needLan.rawValue, value: job.needLan)
|
||
try lcObject.set(PLJob.CodingKeys.needFrame.rawValue, value: job.needFrame)
|
||
try lcObject.set(PLJob.CodingKeys.otherNeed.rawValue, value: job.otherNeed)
|
||
|
||
//福利
|
||
try lcObject.set(PLJob.CodingKeys.moveFee.rawValue, value: job.moveFee)
|
||
try lcObject.set(PLJob.CodingKeys.noOverTime.rawValue, value: job.noOverTime)
|
||
try lcObject.set(PLJob.CodingKeys.otherBenefit.rawValue, value: job.otherBenefit)
|
||
|
||
//其他
|
||
try lcObject.set(PLJob.CodingKeys.companyName.rawValue, value: job.companyName)
|
||
try lcObject.set(PLJob.CodingKeys.userID.rawValue, value: job.userID)
|
||
// try lcObject.set("updatedAT", value: job.updatedAT)
|
||
|
||
// 将对象保存到云端
|
||
// _ = lcObject.save { result in
|
||
// switch result {
|
||
// case .success:
|
||
// // 成功保存之后,执行其他逻辑
|
||
// break
|
||
// case .failure(error: let error):
|
||
// // 异常处理
|
||
// print(error)
|
||
// }
|
||
// }
|
||
|
||
try await lcObject.save()
|
||
}
|
||
|
||
func saveByREST(job: PLJob) async throws {
|
||
//
|
||
// guard let url = URL(string: "\(kServerURLStr)/1.1/classes/PLJob") else {
|
||
// throw NetworkError.invalidURL//抛出问题 -> 无效网址
|
||
// }//有值则赋值给url,没有则进入else
|
||
//
|
||
try await RESTManager.shared.save(to: "\(kServerURLStr)/1.1/classes/\(className)", object: job)
|
||
}
|
||
// MARK: - 上/下线工作
|
||
func toggleJobStatus(id: String, isAictive: Bool) async throws {
|
||
let query = LCQuery(className: className)
|
||
query.whereKey("id", .equalTo(id))
|
||
let lcObject = try await query.getFirst()
|
||
try lcObject.set(PLJob.CodingKeys.isActive.rawValue, value: isAictive)
|
||
try await lcObject.save()
|
||
}
|
||
// MARK: - 删除工作
|
||
func removeJob(id: String) async throws {
|
||
let query = LCQuery(className: className)
|
||
query.whereKey("id", .equalTo(id))
|
||
let lcObject = try await query.getFirst()
|
||
try await lcObject.delete()
|
||
}
|
||
// MARK: -删除某个用户发布的所有job
|
||
func removeJobs(by userID: String) async {
|
||
let query = LCQuery(className: className)
|
||
query.whereKey(PLJob.CodingKeys.userID.rawValue, .equalTo(userID))
|
||
guard let jobObjects = try? await query.find() else { return }
|
||
try? await LCObject.delete(jobObjects)//批量删除
|
||
}
|
||
|
||
}
|