UNPKG

@mokelao/leancloud-library

Version:

基于leancloud的js封装库

226 lines (207 loc) 6.65 kB
import Utils from './utils' class $Object { constructor(AV, className, defaultACL, request, that) { this.AV = AV this.$http = className ? new AV.Object(className) : AV.Object this.defaultACL = defaultACL this.request = request this.that = that this.avObject = null } // 保存 save() { const { $http, avObject, request, that } = this const dispatchRequest = () => (avObject ? avObject.save() : $http.save()) return request.call(that, dispatchRequest) } saveAll(objects) { const { AV, request, that } = this const dispatchRequest = () => AV.Object.saveAll(objects) return request.call(that, dispatchRequest) } destroy() { const { $http, avObject, request, that } = this const dispatchRequest = () => avObject ? avObject.destroy() : $http.destroy() return request.call(that, dispatchRequest) } destroyAll(objectIds) { const { AV, request, that } = this const dispatchRequest = () => AV.Object.destroyAll(objectIds) return request.call(that, dispatchRequest) } fetch() { const { $http, avObject, request, that } = this const dispatchRequest = () => (avObject ? avObject.fetch() : $http.fetch()) return request.call(that, dispatchRequest) } fetchAll(objectIds) { const { AV, request, that } = this const dispatchRequest = () => AV.Object.fetchAll(objectIds) return request.call(that, dispatchRequest) } increment(key, count) { const { $http, avObject } = this const http = avObject || $http this.avObject = request.increment(key, count) return this } extend(classname) { if (!classname) return null return this.$http.extend(classname) } getUsers() { let request = this.$http if (this.avObject) request = this.avObject request.getUsers() this.avObject = request return this } add(key, item) { let request = this.$http if (this.avObject) request = this.avObject request.add(key, item) this.avObject = request return this } createWithoutData(className, objectId) { const { AV, avObject, $http } = this this.avObject = AV.Object.createWithoutData(className, objectId) return this } set(jsonObj) { let request = this.$http if (this.avObject) request = this.avObject for (const k in jsonObj) { request.set(k, jsonObj[k]) } this.avObject = request return this } unset(keys) { let request = this.$http if (!keys || !keys.length) return if (this.avObject) request = this.avObject keys.forEach((item) => request.unset(item)) this.avObject = request return this } setACL(acl) { if (!acl) return let request = this.$http if (this.avObject) request = this.avObject request.setACL(acl) this.avObject = request return this } // 个人定制API async handleData(data, { $pointType, $acl }) { const { AV, $http, avObject, that, defaultACL } = this const TYPE = $pointType const ACL = $acl const jsonObj = { ...data, } const setData = {} // acl对象 if (defaultACL) this.setACL(defaultACL) Object.keys(jsonObj).forEach((item) => { if ( jsonObj[item] && (!Utils.isPlainObject(jsonObj[item]) || !jsonObj[item][TYPE]) && item !== ACL ) { setData[item] = jsonObj[item] } else if (jsonObj[ACL] && Utils.isPlainObject(jsonObj[ACL])) { const aclObj = that.ACL().createACL({ ...jsonObj[ACL] }).avObject this.setACL(aclObj) } }) // point指针对象 const pointObjs = Object.keys(jsonObj) .filter( (item) => Utils.isPlainObject(jsonObj[item]) && jsonObj[item][TYPE] ) .map((item) => ({ [item]: jsonObj[item], })) // point指针搜索项 const pointObjKeys = pointObjs.map((item) => Object.keys(item)[0]) const findDatas = await Promise.all( pointObjs.map(async (item, index) => { const value = item[pointObjKeys[index]] const conditionKey = Object.keys(value).filter((item) => item !== TYPE) const qdata = new AV.Query(value[TYPE]) const point = await qdata .equalTo([conditionKey[0]], value[conditionKey[0]]) .first() return { key: pointObjKeys[index], point, } }) ) const pointDatas = findDatas .filter((item) => item.point) .map((item) => ({ key: item.key, point: AV.Object.createWithoutData(item.point.className, item.point.id), className: item.point.className, id: item.point.id, })) pointDatas.forEach((item) => (setData[item.key] = item.point)) return setData } /** * 构建或更新数据库行数据对象 (行对象) * @param {Array} objects 需要保存的数据对象数组 * @param {String} $objectId 需要修改的对象id属性名 * @param {String} $class pointer的class名称 * @param {String} $acl acl的属性名称 * @return {Array} 创建好的LeanCloud数据对象数组 */ async setData( objects, { $objectId = 'objectId', $pointType = 'pointType', $acl = 'acl' } = {} ) { if (!objects && objects.length) return const OBJECT_ID = $objectId const TYPE = $pointType const ACL = $acl const { AV, $http, avObject, that } = this const { className } = $http const AVObjcets = await Promise.all( objects.map(async (item) => { const hasId = item[OBJECT_ID] const data = hasId ? item.data : item const request = hasId ? this.createWithoutData(className, hasId).avObject : $http const setData = await this.handleData(data, { $pointType: TYPE, $acl: ACL, }) request.set({ ...setData }) return request }) ) return this.saveAll(AVObjcets) } /** * 批量删除数据库行数据对象或对象属性 (行对象) * @param {Array} objectIds 需要删除的数据对象id数组 * @return null 返回为空 */ deleteData(objectIds) { const { AV, $http } = this const points = [] const { className = '' } = $http if (!className) return if (!objectIds || !objectIds.length) return objectIds.forEach((item) => points.push(AV.Object.createWithoutData(className, item)) ) return this.destroyAll(points) } } export default $Object