UNPKG

dobo

Version:

Database ORM/ODM for Bajo Framework

39 lines (36 loc) 1.59 kB
async function singleRelRows ({ schema, record, options = {} }) { const { isSet } = this.lib.aneka const { find } = this.lib._ const props = schema.properties.filter(p => isSet(p.rel) && !(options.hidden ?? []).includes(p.name)) const rels = {} options.rels = options.rels ?? [] if (props.length > 0) { for (const prop of props) { for (const key in prop.rel) { if (!((typeof options.rels === 'string' && ['*', 'all'].includes(options.rels)) || options.rels.includes(key))) continue const val = prop.rel[key] if (val.fields.length === 0) continue const relschema = this.getSchema(val.schema) const relFilter = options.filter ?? {} const query = {} query[val.propName] = record[prop.name] if (val.propName === 'id') { const idField = find(relschema.properties, { name: 'id' }) if (idField.type === 'integer') query[val.propName] = parseInt(query[val.propName]) } relFilter.query = query const relOptions = { dataOnly: true, rels: [] } const results = await this.recordFind(relschema.name, relFilter, relOptions) const fields = [...val.fields] if (!fields.includes(prop.name)) fields.push(prop.name) const data = [] for (const res of results) { data.push(await this.pickRecord({ record: res, fields, schema: relschema })) } rels[key] = ['one-to-one'].includes(val.type) ? data[0] : data } } } record._rel = rels } export default singleRelRows