// // 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)//批量删除 } }