@mathrunet/masamune
Version:
Manages packages for the server portion (NodeJS) of the Masamune framework.
159 lines • 5.66 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FirestoreModelRefBaseConverter = exports.ModelRefBaseConverter = void 0;
const model_field_value_converter_1 = require("../model_field_value_converter");
const utils_1 = require("../../utils");
const firestore_1 = require("firebase-admin/firestore");
const model_field_value_1 = require("../model_field_value");
/**
* ModelFieldValueConverter for [ModelRefBase].
*
* [ModelRefBase]用のModelFieldValueConverter。
*/
class ModelRefBaseConverter extends model_field_value_converter_1.ModelFieldValueConverter {
/**
* ModelRefBase ModelFieldValueConverter.
*
* ModelRefBase用のModelFieldValueConverter。
*/
constructor() {
super();
}
type = "ModelRefBase";
convertFrom(key, value, original) {
if (value !== null && typeof value === "object" && "@type" in value && value["@type"] === this.type) {
const ref = value["@ref"] ?? "";
const doc = value["@doc"] ?? undefined;
return {
[key]: new model_field_value_1.ModelRefBase(ref, doc, "server"),
};
}
return null;
}
convertTo(key, value, original) {
if (value instanceof model_field_value_1.ModelRefBase) {
return {
[key]: {
"@type": this.type,
"@ref": value["@ref"],
"@doc": value["@doc"],
"@source": value["@source"],
},
};
}
return null;
}
}
exports.ModelRefBaseConverter = ModelRefBaseConverter;
/**
* FirestoreConverter for [ModelRef].
*
* [ModelRef]用のFirestoreConverter。
*/
class FirestoreModelRefBaseConverter extends model_field_value_converter_1.FirestoreModelFieldValueConverter {
/**
* FirestoreConverter for [ModelRef].
*
* [ModelRef]用のFirestoreConverter。
*/
constructor() {
super();
}
type = "ModelRefBase";
convertFrom(key, value, original, firestoreInstance) {
if (value instanceof firestore_1.DocumentReference) {
const path = value.path.replace(/\/+$/, '');
return {
[key]: {
"@type": "ModelRefBase",
"@ref": path, // Remove trailing slashes
"@doc": firestoreInstance.doc(path),
},
};
}
else if (Array.isArray(value)) {
const res = [];
for (const tmp of value) {
if (tmp instanceof firestore_1.DocumentReference) {
const path = tmp.path.replace(/\/+$/, '');
res.push({
"@type": "ModelRefBase",
"@ref": path, // Remove trailing slashes
"@doc": firestoreInstance.doc(path),
});
}
}
if (res.length > 0) {
return {
[key]: res,
};
}
}
else if ((0, utils_1.isDynamicMap)(value)) {
const res = {};
for (const k in value) {
const val = value[k];
if (val instanceof firestore_1.DocumentReference) {
const path = val.path.replace(/\/+$/, '');
res[k] = {
"@type": "ModelRefBase",
"@ref": path, // Remove trailing slashes
"@doc": firestoreInstance.doc(path),
};
}
}
if (Object.keys(res).length > 0) {
return {
[key]: res,
};
}
}
return null;
}
convertTo(key, value, _original, firestoreInstance) {
if (value != null && typeof value === "object" && "@type" in value) {
const type = value["@type"] ?? "";
if (type.startsWith(this.type)) {
const refPath = value["@ref"] ?? "";
return {
[key]: firestoreInstance.doc(refPath),
};
}
}
else if (Array.isArray(value)) {
const list = value.filter((e) => e != null && typeof e === "object" && "@type" in e);
if (list.length > 0 && list.every((e) => e["@type"]?.startsWith(this.type))) {
const res = [];
for (const entry of list) {
const refPath = entry["@ref"] ?? "";
res.push(firestoreInstance.doc(refPath));
}
return {
[key]: res,
};
}
}
else if ((0, utils_1.isDynamicMap)(value)) {
const map = {};
for (const k in value) {
const v = value[k];
if (v != null && typeof v === "object" && "@type" in v) {
map[k] = v;
}
}
if (Object.keys(map).length > 0 && Object.values(map).every((e) => e["@type"]?.startsWith(this.type))) {
const res = {};
for (const [k, entry] of Object.entries(map)) {
const refPath = entry["@ref"] ?? "";
res[k] = firestoreInstance.doc(refPath);
}
return {
[key]: res,
};
}
}
return null;
}
}
exports.FirestoreModelRefBaseConverter = FirestoreModelRefBaseConverter;
//# sourceMappingURL=model_ref_base_converter.js.map