mirror of https://github.com/nocodb/nocodb
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
559 lines
16 KiB
559 lines
16 KiB
3 years ago
|
function translateUiToLibCall(args, op, opArgs) {
|
||
3 years ago
|
const data = {
|
||
4 years ago
|
type: null,
|
||
|
module: null,
|
||
|
title: null
|
||
|
}
|
||
|
|
||
|
switch (op) {
|
||
|
case 'projectCreate1':
|
||
3 years ago
|
data.type = 'Create'
|
||
|
data.title = opArgs.project.title
|
||
|
data.module = 'Project'
|
||
|
break
|
||
4 years ago
|
case 'projectReadByFolder':
|
||
3 years ago
|
data.type = 'Reading'
|
||
|
data.title = ''
|
||
|
data.module = 'Project'
|
||
|
break
|
||
4 years ago
|
case 'tableCreate':
|
||
3 years ago
|
data.type = 'Create'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'tableList':
|
||
|
data.api = 'DB_TABLE_LIST'
|
||
3 years ago
|
data.type = 'List'
|
||
|
data.title = 'list'
|
||
|
data.module = 'table'
|
||
|
break
|
||
3 years ago
|
case 'xcTableAndViewList':
|
||
3 years ago
|
data.api = 'DB_TABLE_LIST'
|
||
3 years ago
|
data.type = 'List'
|
||
|
data.title = 'list'
|
||
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'tableUpdate':
|
||
3 years ago
|
data.type = 'Update'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'tableDelete':
|
||
3 years ago
|
data.type = 'Delete'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'viewCreate':
|
||
3 years ago
|
data.type = 'Create'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.view_name
|
||
3 years ago
|
data.module = 'View'
|
||
|
break
|
||
4 years ago
|
case 'viewList':
|
||
3 years ago
|
data.type = 'List'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.view_name
|
||
3 years ago
|
data.module = 'View'
|
||
|
break
|
||
4 years ago
|
case 'viewUpdate':
|
||
3 years ago
|
data.type = 'Update'
|
||
|
// data.title = opArgs.view_name;
|
||
|
data.module = 'View'
|
||
|
break
|
||
4 years ago
|
case 'viewDelete':
|
||
3 years ago
|
data.type = 'Delete'
|
||
3 years ago
|
data.title = opArgs.title || opArgs.view_name
|
||
3 years ago
|
data.module = 'View'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'functionCreate':
|
||
3 years ago
|
data.type = 'Create'
|
||
|
data.title = opArgs.function_name
|
||
|
data.module = 'Function'
|
||
|
break
|
||
4 years ago
|
case 'functionList':
|
||
3 years ago
|
data.type = ''
|
||
|
// data.title = opArgs.function_name;
|
||
|
data.module = 'Function'
|
||
|
break
|
||
4 years ago
|
case 'functionUpdate':
|
||
3 years ago
|
data.type = 'Update'
|
||
|
data.title = opArgs.function_name
|
||
|
data.module = 'Function'
|
||
|
break
|
||
4 years ago
|
case 'functionDelete':
|
||
3 years ago
|
data.type = 'Delete'
|
||
|
data.title = opArgs.function_name
|
||
|
data.module = 'Function'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'procedureCreate':
|
||
3 years ago
|
data.type = 'Create'
|
||
|
data.title = opArgs.procedure_name
|
||
|
data.module = 'Procedure'
|
||
|
break
|
||
4 years ago
|
case 'procedureList':
|
||
3 years ago
|
data.type = 'List'
|
||
|
// data.title = opArgs.procedure_name;
|
||
|
data.module = 'Procedure'
|
||
|
break
|
||
4 years ago
|
case 'procedureUpdate':
|
||
3 years ago
|
data.type = 'Update'
|
||
|
data.title = opArgs.procedure_name
|
||
|
data.module = 'Procedure'
|
||
|
break
|
||
4 years ago
|
case 'procedureDelete':
|
||
3 years ago
|
data.type = 'Delete'
|
||
|
data.title = opArgs.procedure_name
|
||
|
data.module = 'Procedure'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'sequenceCreate':
|
||
3 years ago
|
data.type = 'Create'
|
||
|
data.title = opArgs.sequence_name
|
||
|
data.module = 'Sequence'
|
||
|
break
|
||
4 years ago
|
case 'sequenceList':
|
||
3 years ago
|
data.type = 'List'
|
||
|
// data.title = opArgs.sequence_name;
|
||
|
data.module = 'Sequence'
|
||
|
break
|
||
4 years ago
|
case 'sequenceUpdate':
|
||
3 years ago
|
data.type = 'Update'
|
||
|
data.title = opArgs.sequence_name
|
||
|
data.module = 'Sequence'
|
||
|
break
|
||
4 years ago
|
case 'sequenceDelete':
|
||
3 years ago
|
data.type = 'Delete'
|
||
|
data.title = opArgs.sequence_name
|
||
|
data.module = 'Sequence'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'triggerCreate':
|
||
3 years ago
|
data.type = 'Create '
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'trigger'
|
||
|
break
|
||
4 years ago
|
case 'triggerList':
|
||
3 years ago
|
data.type = 'Create '
|
||
|
// data.title = opArgs.trigger_name;
|
||
|
data.module = 'trigger'
|
||
|
break
|
||
4 years ago
|
case 'triggerUpdate':
|
||
3 years ago
|
data.type = 'Update '
|
||
|
data.title = opArgs.trigger_name
|
||
|
data.module = 'trigger'
|
||
|
break
|
||
4 years ago
|
case 'triggerDelete':
|
||
3 years ago
|
data.type = 'Delete '
|
||
|
data.title = opArgs.trigger_name
|
||
|
data.module = 'trigger'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'indexCreate':
|
||
3 years ago
|
data.type = 'Create Index on '
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'indexList':
|
||
3 years ago
|
data.type = 'List'
|
||
3 years ago
|
// data.title = opArgs.table_name;
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'indexUpdate':
|
||
3 years ago
|
data.type = 'Update Index on '
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
case 'indexDelete':
|
||
3 years ago
|
data.type = 'Delete Index on '
|
||
3 years ago
|
data.title = opArgs.title || opArgs.table_name
|
||
3 years ago
|
data.module = 'table'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'rowCreate':
|
||
3 years ago
|
data.type = ''
|
||
|
data.title = opArgs
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
case 'rowList':
|
||
3 years ago
|
data.type = 'List'
|
||
|
data.title = opArgs
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
case 'rowUpdate':
|
||
3 years ago
|
data.type = ''
|
||
|
data.title = opArgs
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
case 'rowDelete':
|
||
3 years ago
|
data.type = ''
|
||
|
data.title = opArgs
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'seedInit':
|
||
3 years ago
|
data.type = 'Init'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
case 'seedTerm':
|
||
3 years ago
|
data.type = 'Term'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
case 'seedStart':
|
||
3 years ago
|
data.type = 'Start'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
case 'seedStop':
|
||
3 years ago
|
data.type = 'Stop'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
case 'seedSettingsRead':
|
||
3 years ago
|
data.type = 'Settings'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
case 'seedSettingsCreate':
|
||
3 years ago
|
data.type = 'Settings Create'
|
||
|
data.title = ''
|
||
|
data.module = 'Seed'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'projectGenerateBackend':
|
||
3 years ago
|
data.type = 'Generate Code'
|
||
|
data.title = ''
|
||
|
data.module = 'Project'
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'projectGenerateBackendGql':
|
||
3 years ago
|
data.type = 'Generate GraphQL Code'
|
||
|
data.title = ''
|
||
|
data.module = 'Project'
|
||
|
break
|
||
4 years ago
|
case 'tableRename':
|
||
3 years ago
|
data.type = 'Table rename'
|
||
|
data.title = ''
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'relationCreate':
|
||
3 years ago
|
case 'xcM2MRelationCreate':
|
||
4 years ago
|
case 'xcVirtualRelationCreate':
|
||
3 years ago
|
data.type = 'Relation create'
|
||
|
data.title = ''
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
|
||
|
case 'relationDelete':
|
||
|
case 'xcVirtualRelationDelete':
|
||
3 years ago
|
case 'xcRelationColumnDelete':
|
||
3 years ago
|
data.type = 'Relation delete'
|
||
|
data.title = ''
|
||
|
data.module = ''
|
||
|
break
|
||
4 years ago
|
|
||
|
default:
|
||
3 years ago
|
throw new Error(`Should not have occurred ${op}`)
|
||
4 years ago
|
}
|
||
|
|
||
3 years ago
|
return data
|
||
4 years ago
|
}
|
||
|
|
||
|
export const state = () => ({
|
||
|
sqlMgr: null
|
||
3 years ago
|
})
|
||
4 years ago
|
|
||
|
export const mutations = {
|
||
3 years ago
|
set(state, sqlMgrSingleton) {
|
||
3 years ago
|
state.sqlMgr = sqlMgrSingleton
|
||
|
}
|
||
4 years ago
|
|
||
3 years ago
|
}
|
||
4 years ago
|
|
||
|
export const getters = {
|
||
|
// sqlMgr(state) {
|
||
|
// return state.sqlMgr;
|
||
|
// }
|
||
3 years ago
|
}
|
||
4 years ago
|
|
||
|
export const actions = {
|
||
|
|
||
|
//
|
||
|
// async instantiateSqlMgr({commit, state, ...rest}, data) {
|
||
|
// console.log(this)
|
||
|
// if (!state.sqlMgr) {
|
||
|
// sqlMgrSingleton = new SqlMgr(rest);
|
||
|
// console.log(
|
||
|
// "\n\n************************sqlMgr is created************************\n\n."
|
||
|
// );
|
||
|
// commit("set", sqlMgrSingleton);
|
||
|
// } else {
|
||
|
// console.log("sqlMgr is already instantiated.");
|
||
|
// console.log(state.sqlMgr);
|
||
|
// }
|
||
|
// return state.sqlMgr;
|
||
|
// },
|
||
|
|
||
3 years ago
|
async ActSqlOpPlus({ commit, state, dispatch, rootState }, [args, op, opArgs]) {
|
||
3 years ago
|
const params = {}
|
||
4 years ago
|
if (this.$router.currentRoute && this.$router.currentRoute.params && this.$router.currentRoute.params.project_id) {
|
||
3 years ago
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
4 years ago
|
}
|
||
3 years ago
|
const data = translateUiToLibCall(args, op, opArgs)
|
||
4 years ago
|
|
||
3 years ago
|
commit('notification/MutListAdd', { status: 'pending', ...data }, { root: true })
|
||
4 years ago
|
|
||
3 years ago
|
const headers = {}
|
||
3 years ago
|
if (rootState.project.appInfo && rootState.project.appInfo.authType === 'masterKey') {
|
||
3 years ago
|
headers['xc-master-key'] = rootState.users.masterKey || ''
|
||
3 years ago
|
} else if (rootState.project.appInfo && rootState.project.appInfo.authType === 'jwt') {
|
||
3 years ago
|
headers['xc-auth'] = rootState.users.token || ''
|
||
4 years ago
|
}
|
||
|
|
||
|
try {
|
||
3 years ago
|
let result = null
|
||
4 years ago
|
if (data.module === 'Project') {
|
||
3 years ago
|
result = await dispatch('ActSqlOp', [args, op, opArgs])
|
||
4 years ago
|
} else if (data.module === 'Seed' || (data.title || '').toLowerCase() === 'list' || data.type.toLowerCase() === 'list') {
|
||
3 years ago
|
result = await dispatch('ActSqlOp', [args, op, opArgs])
|
||
4 years ago
|
} else {
|
||
|
result = (await this.$axios({
|
||
3 years ago
|
url: '?q=sqlOpPlus_' + op,
|
||
|
baseURL: `${this.$axios.defaults.baseURL}/dashboard`,
|
||
|
data: { api: op, ...args, ...params, args: opArgs, sqlOpPlus: true },
|
||
|
headers,
|
||
|
method: 'post'
|
||
|
}
|
||
|
)).data
|
||
4 years ago
|
}
|
||
|
|
||
3 years ago
|
// clear meta cache on relation create/delete
|
||
|
// todo: clear only necessary metas
|
||
|
// todo: include missing operations
|
||
|
if ([
|
||
|
// 'xcModelSet',
|
||
|
'xcM2MRelationCreate',
|
||
|
'xcVirtualRelationCreate',
|
||
|
'relationCreate',
|
||
|
'relationDelete',
|
||
|
'xcVirtualRelationDelete',
|
||
|
'xcRelationColumnDelete'
|
||
|
].includes(op)) {
|
||
|
if (opArgs.parentTable) {
|
||
3 years ago
|
dispatch('meta/ActLoadMeta', { ...args, ...params, table_name: opArgs.parentTable, force: true }, { root: true })
|
||
3 years ago
|
}
|
||
|
if (opArgs.childTable) {
|
||
3 years ago
|
dispatch('meta/ActLoadMeta', { ...args, ...params, table_name: opArgs.childTable, force: true }, { root: true })
|
||
3 years ago
|
}
|
||
|
}
|
||
|
|
||
3 years ago
|
commit('notification/MutListRemove', { status: 'success', ...data }, { root: true })
|
||
|
return result
|
||
4 years ago
|
} catch (e) {
|
||
3 years ago
|
commit('notification/MutListRemove', { status: 'error', ...data }, { root: true })
|
||
|
throw e
|
||
4 years ago
|
}
|
||
|
},
|
||
|
|
||
3 years ago
|
async ActSqlOp({
|
||
|
commit,
|
||
|
state,
|
||
|
rootState,
|
||
|
dispatch
|
||
|
}, [args, op, opArgs, cusHeaders, cusAxiosOptions, queryParams, returnResponse]) {
|
||
3 years ago
|
const params = {}
|
||
3 years ago
|
|
||
3 years ago
|
if (this.$router.currentRoute && this.$router.currentRoute.params) {
|
||
|
if (this.$router.currentRoute.params.project_id) {
|
||
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
|
} else if (this.$router.currentRoute.params.shared_base_id) {
|
||
|
params.project_id = rootState.project.projectId
|
||
|
}
|
||
4 years ago
|
}
|
||
3 years ago
|
|
||
4 years ago
|
try {
|
||
3 years ago
|
const headers = {}
|
||
3 years ago
|
if (rootState.project.appInfo && rootState.project.appInfo.authType === 'masterKey') {
|
||
3 years ago
|
headers['xc-master-key'] = rootState.users.masterKey
|
||
3 years ago
|
} else if (rootState.project.appInfo && rootState.project.appInfo.authType === 'jwt') {
|
||
3 years ago
|
headers['xc-auth'] = rootState.users.token
|
||
4 years ago
|
}
|
||
|
|
||
|
if (cusHeaders) {
|
||
|
Object.assign(headers, cusHeaders)
|
||
|
}
|
||
3 years ago
|
const res = (await this.$axios({
|
||
4 years ago
|
url: '?q=sqlOp_' + op,
|
||
4 years ago
|
baseURL: `${this.$axios.defaults.baseURL}/dashboard`,
|
||
3 years ago
|
data: { api: op, ...args, ...params, args: opArgs },
|
||
4 years ago
|
headers,
|
||
|
method: 'post',
|
||
|
params: (args && args.query) || {},
|
||
3 years ago
|
...(cusAxiosOptions || {})
|
||
3 years ago
|
|
||
3 years ago
|
}))
|
||
|
|
||
|
const data = res.data
|
||
3 years ago
|
|
||
3 years ago
|
// clear meta cache on relation create/delete
|
||
3 years ago
|
// todo: clear only necessary metas
|
||
|
// todo: include missing operations
|
||
3 years ago
|
if ([
|
||
3 years ago
|
// 'xcModelSet',
|
||
3 years ago
|
'xcM2MRelationCreate',
|
||
|
'xcVirtualRelationCreate',
|
||
3 years ago
|
'relationCreate',
|
||
3 years ago
|
'relationDelete',
|
||
|
'xcVirtualRelationDelete',
|
||
3 years ago
|
'xcRelationColumnDelete'
|
||
|
].includes(op)) {
|
||
3 years ago
|
if (opArgs.parentTable) {
|
||
3 years ago
|
dispatch('meta/ActLoadMeta', { ...args, ...params, table_name: opArgs.parentTable, force: true }, { root: true })
|
||
3 years ago
|
}
|
||
3 years ago
|
if (opArgs.childTable) {
|
||
3 years ago
|
dispatch('meta/ActLoadMeta', { ...args, ...params, table_name: opArgs.childTable, force: true }, { root: true })
|
||
3 years ago
|
}
|
||
|
}
|
||
3 years ago
|
|
||
3 years ago
|
if (returnResponse) {
|
||
|
return res
|
||
|
}
|
||
|
|
||
3 years ago
|
return data
|
||
4 years ago
|
} catch (e) {
|
||
3 years ago
|
let msg
|
||
|
if (e.response.data instanceof Blob) {
|
||
|
try {
|
||
|
msg = JSON.parse(await e.response.data.text()).msg
|
||
|
} catch {
|
||
|
msg = 'Some internal error occurred'
|
||
|
}
|
||
|
} else {
|
||
|
msg = e.response.data.msg || 'Some internal error occurred'
|
||
|
}
|
||
|
const err = new Error(msg)
|
||
3 years ago
|
err.response = e.response
|
||
|
throw err
|
||
4 years ago
|
}
|
||
|
},
|
||
|
|
||
3 years ago
|
async ActUploadOld({
|
||
|
commit,
|
||
|
state,
|
||
|
rootState,
|
||
|
dispatch
|
||
|
}, [args, op, opArgs, file, cusHeaders, cusAxiosOptions, formData]) {
|
||
|
return await dispatch('ActUpload', { args, op, opArgs, file, cusHeaders, cusAxiosOptions, formData })
|
||
|
},
|
||
|
|
||
3 years ago
|
async ActTable({
|
||
|
commit,
|
||
|
state,
|
||
|
rootState,
|
||
|
dispatch
|
||
|
}, body) {
|
||
|
const params = {}
|
||
|
if (this.$router.currentRoute && this.$router.currentRoute.params && this.$router.currentRoute.params.project_id) {
|
||
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
|
}
|
||
|
|
||
|
if (this.$router.currentRoute && this.$router.currentRoute.params && this.$router.currentRoute.params.project_id) {
|
||
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
|
}
|
||
|
const headers = { 'xc-auth': rootState.users.token }
|
||
|
|
||
|
return (await this.$axios({
|
||
|
url: `projects/${params.project_id}/tables/${body.id}`,
|
||
|
baseURL: `${this.$axios.defaults.baseURL}/dashboard`,
|
||
|
data: body, // {api: op, ...args, args: opArgs},
|
||
|
headers,
|
||
|
method: 'post'
|
||
|
})).data
|
||
|
},
|
||
|
|
||
3 years ago
|
async ActUpload({ commit, state, rootState }, {
|
||
|
args = {},
|
||
|
op,
|
||
|
opArgs,
|
||
|
file,
|
||
|
cusHeaders = {},
|
||
|
cusAxiosOptions = {},
|
||
|
formData = new FormData()
|
||
|
}) {
|
||
4 years ago
|
try {
|
||
3 years ago
|
const params = {}
|
||
4 years ago
|
if (this.$router.currentRoute && this.$router.currentRoute.params && this.$router.currentRoute.params.project_id) {
|
||
3 years ago
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
4 years ago
|
}
|
||
3 years ago
|
|
||
|
if (this.$router.currentRoute && this.$router.currentRoute.params && this.$router.currentRoute.params.project_id) {
|
||
|
params.project_id = this.$router.currentRoute.params.project_id
|
||
|
}
|
||
|
|
||
4 years ago
|
const headers = {
|
||
|
'Content-Type': 'multipart/form-data'
|
||
3 years ago
|
}
|
||
4 years ago
|
|
||
3 years ago
|
if (rootState.project.appInfo && rootState.project.appInfo.authType === 'masterKey') {
|
||
3 years ago
|
headers['xc-master-key'] = rootState.users.masterKey
|
||
3 years ago
|
} else if (rootState.project.appInfo && rootState.project.appInfo.authType === 'jwt') {
|
||
3 years ago
|
headers['xc-auth'] = rootState.users.token
|
||
4 years ago
|
}
|
||
|
|
||
|
if (cusHeaders) {
|
||
|
Object.assign(headers, cusHeaders)
|
||
|
}
|
||
|
|
||
3 years ago
|
if (file) {
|
||
|
formData.append('file', file)
|
||
|
}
|
||
4 years ago
|
|
||
3 years ago
|
formData.append('json', JSON.stringify({ api: op, ...params, ...args, args: opArgs }))
|
||
4 years ago
|
// formData.append('project_id', params.project_id);
|
||
|
|
||
|
return (await this.$axios({
|
||
|
url: '?q=sqlOp_' + op,
|
||
3 years ago
|
baseURL: `${this.$axios.defaults.baseURL}/dashboard`,
|
||
3 years ago
|
data: formData, // {api: op, ...args, args: opArgs},
|
||
4 years ago
|
headers,
|
||
|
method: 'post',
|
||
3 years ago
|
params: { project_id: params.project_id, ...((args && args.query) || {}) },
|
||
4 years ago
|
...(cusAxiosOptions || {})
|
||
3 years ago
|
})).data
|
||
4 years ago
|
} catch (e) {
|
||
3 years ago
|
if (e.response && e.response.data) {
|
||
3 years ago
|
throw new Error(e.response.data.msg)
|
||
3 years ago
|
}
|
||
3 years ago
|
throw e
|
||
4 years ago
|
}
|
||
3 years ago
|
}
|
||
4 years ago
|
|
||
3 years ago
|
}
|
||
4 years ago
|
|
||
|
/**
|
||
|
* @copyright Copyright (c) 2021, Xgene Cloud Ltd
|
||
|
*
|
||
|
* @author Naveen MR <oof1lab@gmail.com>
|
||
|
* @author Pranav C Balan <pranavxc@gmail.com>
|
||
4 years ago
|
* @author Wing-Kam Wong <wingkwong.code@gmail.com>
|
||
4 years ago
|
*
|
||
|
* @license GNU AGPL version 3 or any later version
|
||
|
*
|
||
|
* This program is free software: you can redistribute it and/or modify
|
||
|
* it under the terms of the GNU Affero General Public License as
|
||
|
* published by the Free Software Foundation, either version 3 of the
|
||
|
* License, or (at your option) any later version.
|
||
|
*
|
||
|
* This program is distributed in the hope that it will be useful,
|
||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
* GNU Affero General Public License for more details.
|
||
|
*
|
||
|
* You should have received a copy of the GNU Affero General Public License
|
||
|
* along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
*/
|