parent
feec5aff22
commit
169077002d
@ -0,0 +1,198 @@
|
|||||||
|
|
||||||
|
var _config = {
|
||||||
|
"sql":{
|
||||||
|
|
||||||
|
"host":{"type":"text","default":"localhost"},"database":"text","table":"text","username":"text","password":"password"
|
||||||
|
},
|
||||||
|
"cloudant":{
|
||||||
|
"host":{"type":"text","default":"localhost"},
|
||||||
|
"port":{"type":"number","default":5984},
|
||||||
|
"dbname":{"type":"text","label":"database"},
|
||||||
|
"username":{"type":"text"},
|
||||||
|
"password":"password",
|
||||||
|
"doc":{"type":"text","label":"document"}
|
||||||
|
},
|
||||||
|
"couchdb":{"@ref":"cloudant"},
|
||||||
|
"bigquery":{
|
||||||
|
"database":"text","table":"text",
|
||||||
|
"auth_file":{"type":"file","label":"service account json file"}
|
||||||
|
},
|
||||||
|
"postgresql":{
|
||||||
|
"@ref":"sql",
|
||||||
|
"port":{"type":"number","default":5432}
|
||||||
|
},
|
||||||
|
"redshift":{"@ref":"postgresql"},
|
||||||
|
"mariadb":{
|
||||||
|
"@ref":"sql",
|
||||||
|
"port":{"type":"number","default":3306}
|
||||||
|
},
|
||||||
|
"mysql":{
|
||||||
|
"@ref":"sql",
|
||||||
|
"port":{"type":"number","default":3306}
|
||||||
|
},
|
||||||
|
"netezza":{
|
||||||
|
"@ref":"sql",
|
||||||
|
"port":{"type":"number","default":5480}},
|
||||||
|
"sqlserver":{
|
||||||
|
"@ref":"sql",
|
||||||
|
"port":{"type":"number","default":1433}
|
||||||
|
},
|
||||||
|
|
||||||
|
"mongodb":{
|
||||||
|
|
||||||
|
"host":{"type":"text","default":"localhost"},
|
||||||
|
|
||||||
|
"port":{"type":"number","default":2717},
|
||||||
|
"db":{"type":"text","label":"database"},
|
||||||
|
"collection":{"type":"text"},"mechanism":{"type":"text","default":"SCRAM-SHA-256","values":["SCRAM-SHA-256","MONGODB-X509","MONGODB-CR"]}
|
||||||
|
},
|
||||||
|
"nextcloud":{
|
||||||
|
"uid":{"type":"text","label":"user id"},
|
||||||
|
"url":{"type":"text","label":"url of server"},
|
||||||
|
"token":"text"
|
||||||
|
|
||||||
|
},
|
||||||
|
"databricks":{
|
||||||
|
"host":"text","token":"text","cluster_path":"text","schema":"text","catalog":"text"
|
||||||
|
|
||||||
|
},
|
||||||
|
"s3":{
|
||||||
|
"bucket":"text","file":{"type":"text","desc":"aws s3 path of the file"},
|
||||||
|
"region":"text"
|
||||||
|
},
|
||||||
|
"sqlite":{"database":{"type":"text","desc":"path on disk"},"table":"text"},
|
||||||
|
"sqlite3":{"@ref":"sqlite"},
|
||||||
|
"duckdb":{"database":{"type":"text","desc":"path on disk"},"table":"text"},
|
||||||
|
"drill":{
|
||||||
|
"host":"text","port":{"type":"number","default":8047},"ssl":{"type":"bool","values":[true,false],"default":false}
|
||||||
|
|
||||||
|
},
|
||||||
|
"iceberg":{
|
||||||
|
"catalog":"text","database":"text","table":"text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
var ProviderInputForm = function (_provider){
|
||||||
|
this._provider = _provider
|
||||||
|
/**
|
||||||
|
* This section will setup the configuration file as it is intended to be
|
||||||
|
* The configuration fully specified will be used to build the input form
|
||||||
|
*/
|
||||||
|
this._config = {}
|
||||||
|
_parent = {}
|
||||||
|
var _tmpconfig = _config[_provider]
|
||||||
|
this._config = _config[_provider]
|
||||||
|
if (_tmpconfig['@ref'] != null){
|
||||||
|
_pkey = _tmpconfig['@ref']
|
||||||
|
_parent = _config[_pkey]
|
||||||
|
}
|
||||||
|
//-- merge the objects ...
|
||||||
|
this._config = Object.assign({'label':{'type':'text',desc:'reference to this database'}},_parent, _config[_provider])
|
||||||
|
if (this._config['@ref']){
|
||||||
|
delete this._config['@ref']
|
||||||
|
}
|
||||||
|
|
||||||
|
this.getInput = function(_item){//_type,_text,_desc){
|
||||||
|
// if(_type.match(/text|number|password/ig)){
|
||||||
|
|
||||||
|
_item.label= (_item.label == null)?_item.context: _item.label
|
||||||
|
_item.desc = (_item.desc != null)?_item.desc:_item.label
|
||||||
|
_label = $('<label></label>').html(_item.label)
|
||||||
|
_input = $('<input />')
|
||||||
|
$(_input).attr('type',_item.type)
|
||||||
|
|
||||||
|
if(_item.type.match(/number/)) {
|
||||||
|
$(_input).attr("pattern","^[1-9]([0-9])*$")
|
||||||
|
}
|
||||||
|
|
||||||
|
$(_input).attr('placeholder',_item.desc)
|
||||||
|
$(_input).addClass(_item.context)
|
||||||
|
$(_input).attr('id',_item.context)
|
||||||
|
if (_item.default != null){
|
||||||
|
$(_input).val(_item.default)
|
||||||
|
}
|
||||||
|
$(_label).attr('for',_item.context)
|
||||||
|
return $('<div class="form-item"></div>').append(_label,_input)
|
||||||
|
// }
|
||||||
|
|
||||||
|
}
|
||||||
|
this.submit = function (_data){
|
||||||
|
var http = HttpClient.instance()
|
||||||
|
http.setData(JSON.stringify(_data))
|
||||||
|
http.setHeader('Content-Type','application/json')
|
||||||
|
var uri = 'api/register/add'
|
||||||
|
http.post(uri,(x)=>{
|
||||||
|
if(x.status == 200 && x.readyState == 4){
|
||||||
|
//
|
||||||
|
//
|
||||||
|
_init(_data.label)
|
||||||
|
$('.jxmodal').slideUp()
|
||||||
|
}
|
||||||
|
})
|
||||||
|
}
|
||||||
|
this.build = function(_id){
|
||||||
|
//
|
||||||
|
// This will build the form on a pane
|
||||||
|
|
||||||
|
var _form = $('<div class="provider-input-form"></div>')
|
||||||
|
Object.keys(this._config).forEach(_key=>{
|
||||||
|
var _item = this._config[_key]
|
||||||
|
var _type = (_item.constructor == String)?_key:_item.type
|
||||||
|
if(_item.constructor == String){
|
||||||
|
_item = {type:_type}
|
||||||
|
}
|
||||||
|
_item.type = _type
|
||||||
|
_item.context = _key
|
||||||
|
// var _values = (_item.values)?[]:_item.values
|
||||||
|
var _inputLine = this.getInput(_item) //_type,_key,_item.label)
|
||||||
|
$(_form).append(_inputLine)
|
||||||
|
// }
|
||||||
|
})
|
||||||
|
|
||||||
|
//
|
||||||
|
// adding all the items to where they need to be
|
||||||
|
//
|
||||||
|
_back = $('<div class="border-round border db-back"><div class="active"> <i class="fa-solid fa-chevron-left"></i> Go Back</div></div>')
|
||||||
|
$(_back).on('click',()=>{
|
||||||
|
$('.db-form').slideUp(()=>{
|
||||||
|
$('.db-provider').slideDown()
|
||||||
|
|
||||||
|
})
|
||||||
|
})
|
||||||
|
var _submit = this.submit
|
||||||
|
var _provider= this._provider
|
||||||
|
_save = $('<div class="border-round border db-save"><div class="active"> <i class="fa-solid fa-check" style="color:green"></i> Save Now</div></div>')
|
||||||
|
$(_save).attr({'_object':this})
|
||||||
|
$(_save).on('click',()=>{
|
||||||
|
var _nodes = $('.db-form input')
|
||||||
|
var _data = {}
|
||||||
|
_errorCount = 0
|
||||||
|
_nodes.each((_index)=>{
|
||||||
|
var _input = _nodes[_index]
|
||||||
|
_data[_input.id] = _input.value
|
||||||
|
if(_input.value.trim().length == 0){
|
||||||
|
_errorCount += 1
|
||||||
|
$(_input).addClass('input-error')
|
||||||
|
}else{
|
||||||
|
$(_input).removeClass('input-error')
|
||||||
|
}
|
||||||
|
|
||||||
|
})
|
||||||
|
//
|
||||||
|
// assuming no error ...
|
||||||
|
if (_errorCount == 0){
|
||||||
|
_data = Object.assign({},{'provider':_provider}, _data)
|
||||||
|
_submit(_data)
|
||||||
|
}
|
||||||
|
})
|
||||||
|
|
||||||
|
_pane = $('<div class="form-controls"></div>')
|
||||||
|
$(_pane).append(_back,$("<div></div>"),_save)
|
||||||
|
|
||||||
|
$(_id).empty()
|
||||||
|
$(_id).append(_form)
|
||||||
|
$('.db-form .form-controls').remove()
|
||||||
|
$('.db-form').append(_pane)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,51 @@
|
|||||||
|
import transport
|
||||||
|
from io import StringIO
|
||||||
|
import cms
|
||||||
|
import copy
|
||||||
|
import json
|
||||||
|
|
||||||
|
@cms.Plugin(mimetype='application/json',method='GET')
|
||||||
|
def get (**_args) :
|
||||||
|
"""
|
||||||
|
This function will return the list of labels available
|
||||||
|
"""
|
||||||
|
transport.registry.load()
|
||||||
|
_data = copy.copy(transport.registry.DATA)
|
||||||
|
_context = _args['config']['system']['context']
|
||||||
|
_labels = []
|
||||||
|
for _key in _data :
|
||||||
|
|
||||||
|
if _key not in ['default','email','version'] :
|
||||||
|
print (_key)
|
||||||
|
_provider = _data[_key]['provider']
|
||||||
|
_name = None
|
||||||
|
if 'table' in _data[_key] :
|
||||||
|
_name = 'table'
|
||||||
|
elif 'collection' in _data[_key] :
|
||||||
|
_name = 'collection'
|
||||||
|
_table = 'NA' if not _name else _data[_key][_name]
|
||||||
|
_plugins = [] if 'plugins' not in _data[_key]else _data[_key]['plugins']
|
||||||
|
_icon = f'{_context}/api/disk/read?uri=www/html/_assets/images/{_provider}.png'
|
||||||
|
_labels.append({"label":_key,"provider":_provider,'table':_table,'icon':_icon})
|
||||||
|
else:
|
||||||
|
continue
|
||||||
|
return _labels
|
||||||
|
|
||||||
|
@cms.Plugin(mimetype="application/json",method="POST")
|
||||||
|
def add(**_args):
|
||||||
|
"""
|
||||||
|
adding a label to the registry
|
||||||
|
"""
|
||||||
|
_request = _args['request']
|
||||||
|
_entry = _request.json
|
||||||
|
_label = _entry['label']
|
||||||
|
del _entry['label']
|
||||||
|
f = StringIO(json.dumps(_entry))
|
||||||
|
#
|
||||||
|
# @TODO: We need to test the parameters and return the response to the client
|
||||||
|
#
|
||||||
|
transport.registry.set(_label,f)
|
||||||
|
|
||||||
|
#
|
||||||
|
# now we can/should get the rest of the list
|
||||||
|
return get(**_args)
|
Loading…
Reference in new issue