Home Reference Source Repository

src/collection/PojoEndpointProperty.js

import uuid from "uuid";
import cloneDeep from "lodash.clonedeep";
import reduce from "lodash.reduce";

import ObjectProperty from "../ObjectProperty";
import Shadow from "../Shadow";
import StateType from "../StateType";
import Store from "../Store";

import PojoQueryBuilder from "./PojoQueryBuilder";

/*

*/
export default class PojoEndpointProperty extends ObjectProperty {
	constructor(pojo={}) {
		super(PojoEndpointProperty.type);

		this.setShadowClass(PojoEndpointShadow);

		this.id = uuid();

		// model objects kept in instance variable instead of state so direct changes (manual) do not
		// cause a store change
		this.models = pojo;
	}
}


StateType.defineType(PojoEndpointProperty, spec => spec.initialState({}) );


class PojoEndpointShadow extends Shadow {
	get id() {
		return this.$$().id;
	}

	get models() {
		return this.$$().models;
	}

	isConnected() {
		return true;
	}

	queryBuilder() {
		return new PojoQueryBuilder();
	}

	doCreate(shadowModel, model) {
		const obj = cloneDeep(model);

		if (!obj.id) {
			obj.id = uuid();
		}

		this.models[obj.id] = obj;

		return Store.resolve(obj);
	}

	doDelete(id) {
		delete this.models[id];

		return Store.resolve(id);
	}

	doFetch(filter) {
		const models = filter
			?filter.on(this.models)
			:Object.values(this.models);

		return Store.resolve(models);
	}

	doFind(id) {
		return Store.resolve(this.models[id]);
	}

	doUpdate(id, shadowModel, changedProps) {
		this.models[id] = changedProps;

		return Store.resolve(changedProps);
	}
}