Compare commits

..

13 Commits

9 changed files with 427 additions and 6 deletions

View File

@ -1,3 +1 @@
title = "CostaPy"
copyright = "Copyright (C) 2022 Dita Aji Pratama"

View File

@ -11,6 +11,9 @@ from config import directory
import templates.plain.main as template_public
import modules.public.home as public_home
import modules.api.metaprofile.metaprofile as api_metaprofile_metaprofile
import modules.api.metaprofile.baseurl as api_metaprofile_baseurl
app = Bottle()
@app.route('/')
@ -21,3 +24,51 @@ def index():
}
}
return public_home.main().html(params)
@app.route('/api/metaprofile/<alder>', method=['OPTIONS', 'POST'])
def index(alder):
try:
if request.method == 'OPTIONS':
return None
else:
response.content_type = 'application/json'
params = request.json
if alder == 'add':
return json.dumps(api_metaprofile_metaprofile.metaprofile().add(params), indent = 2).encode()
elif alder == 'list':
return json.dumps(api_metaprofile_metaprofile.metaprofile().list(params), indent = 2).encode()
elif alder == 'detail':
return json.dumps(api_metaprofile_metaprofile.metaprofile().detail(params), indent = 2).encode()
elif alder == 'edit':
return json.dumps(api_metaprofile_metaprofile.metaprofile().edit(params), indent = 2).encode()
elif alder == 'remove':
return json.dumps(api_metaprofile_metaprofile.metaprofile().remove(params), indent = 2).encode()
else:
return json.dumps({}, indent = 2).encode()
except Exception as e:
print(str(e),flush=True)
return json.dumps({}, indent = 2).encode()
@app.route('/api/metaprofile/baseurl/<alder>', method=['OPTIONS', 'POST'])
def index(alder):
try:
if request.method == 'OPTIONS':
return None
else:
response.content_type = 'application/json'
params = request.json
if alder == 'add':
return json.dumps(api_metaprofile_baseurl.baseurl().add(params), indent = 2).encode()
elif alder == 'list':
return json.dumps(api_metaprofile_baseurl.baseurl().list(params), indent = 2).encode()
elif alder == 'detail':
return json.dumps(api_metaprofile_baseurl.baseurl().detail(params), indent = 2).encode()
elif alder == 'edit':
return json.dumps(api_metaprofile_baseurl.baseurl().edit(params), indent = 2).encode()
elif alder == 'remove':
return json.dumps(api_metaprofile_baseurl.baseurl().remove(params), indent = 2).encode()
else:
return json.dumps({}, indent = 2).encode()
except Exception as e:
print(str(e),flush=True)
return json.dumps({}, indent = 2).encode()

View File

@ -0,0 +1,139 @@
import mysql.connector as mariadb
from config import database
from scripts import loggorilla
import datetime
class baseurl:
def __init__(self):
self.db_main = mariadb.connect(**database.db_main)
self.cursor = self.db_main.cursor(dictionary=True)
def add(self, params):
APIADDR = "/api/metaprofile/baseurl/add"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
metaprofile = params["metaprofile" ]
name = params["name" ]
url = params["url" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Insert")
self.cursor.execute("INSERT INTO `metaprofile_baseurl` VALUES (DEFAULT, %s, %s, %s) ;", (metaprofile, name, url) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def list(self, params):
APIADDR = "/api/metaprofile/baseurl/list"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
self.cursor.execute("BEGIN;")
try:
self.cursor.execute("select `id`, `name`, `url` from `metaprofile_baseurl` where `metaprofile` = %s ;", (key,) )
row = self.cursor.fetchall()
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data collected"
response["data" ] = row
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def detail(self, params):
APIADDR = "/api/metaprofile/baseurl/detail"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
self.cursor.execute("BEGIN;")
try:
self.cursor.execute("select `id`, `metaprofile`, `name`, `url` from `metaprofile_baseurl` where `id` = %s ;", (key,) )
row = self.cursor.fetchone()
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data collected"
response["data" ] = row
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def edit(self, params):
APIADDR = "/api/metaprofile/baseurl/edit"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
name = params["name" ]
url = params["url" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Update")
self.cursor.execute("UPDATE `metaprofile_baseurl` SET `name` = %s, `url` = %s WHERE `id` = %s ;", (name, url, key) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def remove(self, params):
APIADDR = "/api/metaprofile/baseurl/remove"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Remove")
self.cursor.execute("DELETE FROM `metaprofile_baseurl` WHERE `id` = %s ;", (key,) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response

View File

@ -0,0 +1,136 @@
import mysql.connector as mariadb
from config import database
from scripts import loggorilla
import datetime
class metaprofile:
def __init__(self):
self.db_main = mariadb.connect(**database.db_main)
self.cursor = self.db_main.cursor(dictionary=True)
def add(self, params):
APIADDR = "/api/metaprofile/add"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
favicon = params["favicon" ]
copyright = params["copyright" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Insert")
self.cursor.execute("INSERT INTO `metaprofile` VALUES (DEFAULT, %s, %s) ;", (favicon, copyright) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def list(self, params):
APIADDR = "/api/metaprofile/list"
response = {}
self.cursor.execute("BEGIN;")
try:
self.cursor.execute("select `id`, `favicon`, `copyright` from `metaprofile`;")
row = self.cursor.fetchall()
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data collected"
response["data" ] = row
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def detail(self, params):
APIADDR = "/api/metaprofile/detail"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
self.cursor.execute("BEGIN;")
try:
self.cursor.execute("select `id`, `favicon`, `copyright` from `metaprofile` where `id` = %s ;", (key,) )
row = self.cursor.fetchone()
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data collected"
response["data" ] = row
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def edit(self, params):
APIADDR = "/api/metaprofile/edit"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
favicon = params["favicon" ]
copyright = params["copyright" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Update")
self.cursor.execute("UPDATE `metaprofile` SET `favicon` = %s, `copyright` = %s WHERE `id` = %s ;", (favicon, copyright, key) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response
def remove(self, params):
APIADDR = "/api/metaprofile/remove"
response = {}
loggorilla.prcss(APIADDR, "Define Models")
key = params["key" ]
self.cursor.execute("BEGIN;")
try:
loggorilla.prcss(APIADDR, "Activity: Remove")
self.cursor.execute("DELETE FROM `metaprofile` WHERE `id` = %s ;", (key,) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "success"
response["desc" ] = "data updated"
except Exception as e:
self.cursor.execute("ROLLBACK;")
loggorilla.error(APIADDR, str(e) )
loggorilla.prcss(APIADDR, "Set Response")
response["status" ] = "failed"
response["desc" ] = "Internal Server Error. Please contact us if you still have an error."
finally:
self.cursor.execute("COMMIT;")
self.cursor.close()
self.db_main.close()
return response

View File

@ -1,12 +1,17 @@
from mako.template import Template
from config import globalvar, navigation
import mysql.connector as mariadb
from config import database, globalvar, navigation
from mako.template import Template
class main:
def __init__(self):
pass
self.db_main = mariadb.connect(**database.db_main)
self.cursor = self.db_main.cursor(dictionary=True)
def html(self, params):
self.cursor.execute("SELECT `favicon`, `copyright` FROM `metaprofile` WHERE id = 1 ;")
metaprofile = self.cursor.fetchone()
return Template(params["mako"]["website"]['index']).render(
title = globalvar.title,
header = "Welcome to CostaPy",
@ -16,7 +21,7 @@ class main:
active_page = "Home"
),
footer = Template(params["mako"]["website"]['footer']).render(
copyright = globalvar.copyright,
copyright = metaprofile["copyright"],
),
container = Template(params["mako"]["website"]['container']).render(
greeting = f"Welcome to your new web application! This placeholder page is here to let you know that your web framework is successfully set up and ready to go. Now, it's time to start building your project. Dive into the documentation to explore the features and capabilities at your disposal."

13
scripts/loggorilla.py Normal file
View File

@ -0,0 +1,13 @@
import datetime
def prcss(loc, msg):
print(f"[loggorilla][{datetime.datetime.now()}][\033[32mprcss\033[39m][\033[95m{loc}\033[39m] {msg}", flush=True)
def accss(loc, msg):
print(f"[loggorilla][{datetime.datetime.now()}][\033[36maccss\033[39m][\033[95m{loc}\033[39m] {msg}", flush=True)
def fyinf(loc, msg):
print(f"[loggorilla][{datetime.datetime.now()}][\033[93mfyinf\033[39m][\033[95m{loc}\033[39m] {msg}", flush=True)
def error(loc, msg):
print(f"[loggorilla][{datetime.datetime.now()}][\033[31merror\033[39m][\033[95m{loc}\033[39m] {msg}", flush=True)

60
sql/metaprofile.sql Normal file
View File

@ -0,0 +1,60 @@
-- README
-- Prefix idx_ = index
-- Prefix fk_ = foreign
-- Create an index for fast lookups
-- Defining constraints separately for better readability & maintainability
-- Prefix p_ = Procedure
-- Prefix i_ = Input(s)
-- Prefix v_ = Variable(s)
-- Prefix o_ = Output(s)
-- Main table
create table if not exists `metaprofile` (
`id` int(11) not null auto_increment primary key,
`favicon` longtext default null,
`copyright` longtext default null
) engine=InnoDB default charset=utf8mb4;
create table if not exists `metaprofile_baseurl` (
`id` int(11) not null auto_increment primary key,
`metaprofile` int(11) not null,
`name` longtext not null,
`url` longtext not null,
key `idx_metaprofile` (`metaprofile`),
constraint `metaprofile_baseurl_fk_metaprofile`
foreign key (`metaprofile`) references `metaprofile` (`id`)
on update cascade
on delete cascade
) engine=InnoDB default charset=utf8mb4;
create table if not exists `metaprofile_brand` (
`id` int(11) not null auto_increment primary key,
`metaprofile` int(11) not null,
`name` longtext not null,
`tagline` longtext default null,
`description` longtext default null,
key `idx_metaprofile` (`metaprofile`),
constraint `metaprofile_brand_fk_metaprofile`
foreign key (`metaprofile`) references `metaprofile` (`id`)
on update cascade
on delete cascade
) engine=InnoDB default charset=utf8mb4;
create table if not exists `metaprofile_brand_logo` (
`id` int(11) not null auto_increment primary key,
`brand` int(11) not null,
`name` longtext not null,
`image` longtext not null,
key `idx_brand` (`brand`),
constraint `metaprofile_brand_logo_fk_brand`
foreign key (`brand`) references `metaprofile_brand` (`id`)
on update cascade
on delete cascade
) engine=InnoDB default charset=utf8mb4;
-- Default Data
INSERT INTO metaprofile VALUES (1, 'img/favicon.png', 'Copyright (C) 2022 Dita Aji Pratama');
INSERT INTO metaprofile_baseurl VALUES (1, 1, 'local', 'http://localhost:11000');

BIN
static/img/favicon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 127 KiB

19
static/js/carrack.js Normal file
View File

@ -0,0 +1,19 @@
function sendHttpRequest(url, method, data, callback, contentType = "multipart/form-data", authorization = "") {
var xhr = new XMLHttpRequest();
xhr.open(method, url, true);
xhr.setRequestHeader("Content-Type", contentType);
xhr.setRequestHeader("Authorization", authorization);
xhr.onreadystatechange = function () {
if (xhr.readyState === 4) {
if (xhr.status === 200) {
var response = xhr.responseText;
callback(null, response);
}
else callback(xhr.status, null);
}
};
var requestData;
if (contentType === "application/json") requestData = JSON.stringify(data);
else requestData = data;
xhr.send(requestData);
}