forked from tsai/budibase
5 changed files with 204 additions and 179 deletions
@ -0,0 +1,109 @@ |
|||||
|
const { |
||||
|
ViewNames, |
||||
|
generateMemoryViewID, |
||||
|
getMemoryViewParams, |
||||
|
} = require("../../../db/utils") |
||||
|
const env = require("../../../environment") |
||||
|
|
||||
|
exports.getView = async (db, viewName) => { |
||||
|
if (env.SELF_HOSTED) { |
||||
|
const designDoc = await db.get("_design/database") |
||||
|
return designDoc.views[viewName] |
||||
|
} else { |
||||
|
const viewDoc = await db.get(generateMemoryViewID(viewName)) |
||||
|
return viewDoc.view |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
exports.getViews = async db => { |
||||
|
const response = [] |
||||
|
if (env.SELF_HOSTED) { |
||||
|
const designDoc = await db.get("_design/database") |
||||
|
for (let name of Object.keys(designDoc.views)) { |
||||
|
// Only return custom views, not built ins
|
||||
|
if (Object.values(ViewNames).indexOf(name) !== -1) { |
||||
|
continue |
||||
|
} |
||||
|
response.push({ |
||||
|
name, |
||||
|
...designDoc.views[name], |
||||
|
}) |
||||
|
} |
||||
|
} else { |
||||
|
const views = ( |
||||
|
await db.allDocs( |
||||
|
getMemoryViewParams({ |
||||
|
include_docs: true, |
||||
|
}) |
||||
|
) |
||||
|
).rows.map(row => row.doc) |
||||
|
for (let viewDoc of views) { |
||||
|
response.push({ |
||||
|
name: viewDoc.name, |
||||
|
...viewDoc.view, |
||||
|
}) |
||||
|
} |
||||
|
} |
||||
|
return response |
||||
|
} |
||||
|
|
||||
|
exports.saveView = async (db, originalName, viewName, viewTemplate) => { |
||||
|
if (env.SELF_HOSTED) { |
||||
|
const designDoc = await db.get("_design/database") |
||||
|
designDoc.views = { |
||||
|
...designDoc.views, |
||||
|
[viewName]: viewTemplate, |
||||
|
} |
||||
|
// view has been renamed
|
||||
|
if (originalName) { |
||||
|
delete designDoc.views[originalName] |
||||
|
} |
||||
|
await db.put(designDoc) |
||||
|
} else { |
||||
|
const id = generateMemoryViewID(viewName) |
||||
|
const originalId = originalName ? generateMemoryViewID(originalName) : null |
||||
|
const viewDoc = { |
||||
|
_id: id, |
||||
|
view: viewTemplate, |
||||
|
name: viewName, |
||||
|
tableId: viewTemplate.meta.tableId, |
||||
|
} |
||||
|
try { |
||||
|
const old = await db.get(id) |
||||
|
if (originalId) { |
||||
|
const originalDoc = await db.get(originalId) |
||||
|
await db.remove(originalDoc._id, originalDoc._rev) |
||||
|
} |
||||
|
if (old && old._rev) { |
||||
|
viewDoc._rev = old._rev |
||||
|
} |
||||
|
} catch (err) { |
||||
|
// didn't exist, just skip
|
||||
|
} |
||||
|
await db.put(viewDoc) |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
exports.deleteView = async (db, viewName) => { |
||||
|
if (env.SELF_HOSTED) { |
||||
|
const designDoc = await db.get("_design/database") |
||||
|
const view = designDoc.views[viewName] |
||||
|
delete designDoc.views[viewName] |
||||
|
await db.put(designDoc) |
||||
|
return view |
||||
|
} else { |
||||
|
const id = generateMemoryViewID(viewName) |
||||
|
const viewDoc = await db.get(id) |
||||
|
await db.remove(viewDoc._id, viewDoc._rev) |
||||
|
return viewDoc.view |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
exports.migrateToInMemoryView = async (db, viewName) => { |
||||
|
// delete the view initially
|
||||
|
const designDoc = await db.get("_design/database") |
||||
|
const view = designDoc.views[viewName] |
||||
|
delete designDoc.views[viewName] |
||||
|
await db.put(designDoc) |
||||
|
await exports.saveView(db, null, viewName, view) |
||||
|
} |
||||
Loading…
Reference in new issue