summaryrefslogtreecommitdiff
path: root/public/js
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-04-05 23:08:09 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-04-05 23:08:09 -0400
commitbb85374b79086cd8efde24d23a1bffeb97cae26b (patch)
treea36e2df6a89e567822820ac110afec6a13eacbf6 /public/js
parentfinish dns and start webserver (diff)
downloadwrapper-bb85374b79086cd8efde24d23a1bffeb97cae26b.tar.gz
wrapper-bb85374b79086cd8efde24d23a1bffeb97cae26b.tar.bz2
wrapper-bb85374b79086cd8efde24d23a1bffeb97cae26b.zip
new c version
Diffstat (limited to 'public/js')
-rw-r--r--public/js/api.js51
-rw-r--r--public/js/components.js12
-rw-r--r--public/js/domain.js95
-rw-r--r--public/js/home.js91
-rw-r--r--public/js/login.js44
-rw-r--r--public/js/main.js136
6 files changed, 0 insertions, 429 deletions
diff --git a/public/js/api.js b/public/js/api.js
deleted file mode 100644
index 7a29d65..0000000
--- a/public/js/api.js
+++ /dev/null
@@ -1,51 +0,0 @@
-const endpoint = '/api'
-
-const request = async (url, method, body) => {
-
- let response;
-
- if (method == 'GET') {
- response = await fetch(endpoint + url, {
- method,
- headers: {
- 'Content-Type': 'application/json'
- }
- });
- } else {
- response = await fetch(endpoint + url, {
- method,
- body: JSON.stringify(body),
- headers: {
- 'Content-Type': 'application/json'
- }
- });
- }
-
- if (response.status == 401) {
- location.href = '/login'
- }
- const contentType = response.headers.get("content-type");
- if (contentType && contentType.indexOf("application/json") !== -1) {
- const json = await response.json()
- return { status: response.status, msg: json.msg, json }
- } else {
- const msg = await response.text();
- return { status: response.status, msg }
- }
-}
-
-export const login = async (user, pass) => {
- return await request('/login', 'POST', {user, pass})
-}
-
-export const domains = async () => {
- return await request('/domains', 'GET')
-}
-
-export const del_domain = async (domain) => {
- return await request('/domains', 'DELETE', {domain})
-}
-
-export const records = async (domain) => {
- return await request(`/records?domain=${domain}`, 'GET')
-} \ No newline at end of file
diff --git a/public/js/components.js b/public/js/components.js
deleted file mode 100644
index 00def5f..0000000
--- a/public/js/components.js
+++ /dev/null
@@ -1,12 +0,0 @@
-import { div, parse, span } from './main.js';
-
-export function header(title) {
- return div({id: 'header'},
- span({id: 'logo', class: 'accent'},
- parse("Wrapper")
- ),
- span({id: 'title'},
- parse(title)
- ),
- )
-} \ No newline at end of file
diff --git a/public/js/domain.js b/public/js/domain.js
deleted file mode 100644
index 36af422..0000000
--- a/public/js/domain.js
+++ /dev/null
@@ -1,95 +0,0 @@
-import { del_domain, domains, records } from './api.js'
-import { header } from './components.js'
-import { body, parse, div, input, button, span, is_domain } from './main.js';
-
-function render(domain, records) {
-
- let divs = []
- for (const record of records) {
- divs.push(gen_record(record))
- }
-
- document.body.replaceWith(
- body({},
- header(domain),
- div({id: 'buttons'},
- button({onclick: (event) => {
- location.href = '/home'
- }}, parse("Home")),
- button({}, parse("New Record")),
- ),
- ...divs
- )
- )
-}
-
-function gen_record(record) {
- let domain = record.domain
- let prefix = record.prefix
-
- if (prefix.length > 0) {
- prefix = prefix + '.'
- }
-
- let type = Object.keys(record.record)[0]
- let data = record.record[type]
-
- let divs = []
- for (const key in data) {
- let disp_key;
- if (key == 'ttl') {
- disp_key = 'TTL'
- } else {
- disp_key = upper(key)
- }
- divs.push(
- div({class: 'poperty'},
- div({class: 'key'}, parse(disp_key)),
- div({class: 'value'}, parse(data[key])),
- )
- )
- }
-
- return div({class: 'record'},
- div({class: 'header'},
- span({class: 'type'}, parse(type)),
- span({class: 'prefix'}, parse(prefix)),
- span({class: 'domain'}, parse(domain)),
- button({}, parse("Edit")),
- button({class: 'delete'}, parse("Delete"))
- ),
- div({class: 'properties'},
- ...divs
- )
- )
-}
-
-function upper(string) {
- return string.charAt(0).toUpperCase() + string.slice(1);
-}
-
-async function init() {
-
- const params = new Proxy(new URLSearchParams(window.location.search), {
- get: (searchParams, prop) => searchParams.get(prop),
- });
-
- let domain = params.domain;
-
- if (!is_domain(domain)) {
- location.href = '/home'
- return
- }
-
- let res = await records(domain);
-
- if (res.status !== 200) {
- alert(res.msg)
- return
- }
-
- render(domain, res.json)
-
-}
-
-init() \ No newline at end of file
diff --git a/public/js/home.js b/public/js/home.js
deleted file mode 100644
index f615632..0000000
--- a/public/js/home.js
+++ /dev/null
@@ -1,91 +0,0 @@
-import { del_domain, domains } from './api.js'
-import { header } from './components.js'
-import { body, parse, div, input, button, span, is_domain } from './main.js';
-
-function render(domains) {
- document.body.replaceWith(
- body({},
- header('domains'),
- div({id: 'new'},
- input({
- type: 'text',
- name: 'domain',
- id: 'domain',
- placeholder: 'Type domain name to create new records',
- autocomplete: "off",
- }),
- button({onclick: () => {
- let domain = document.getElementById('domain').value
-
- if (!is_domain(domain)) {
- alert("Invalid domain")
- return
- }
-
- location.href = '/domain?domain='+domain
- }},
- parse("Create")
- )
- ),
- ...domain(domains)
- )
- )
-}
-
-function domain(domains) {
- let divs = []
- for (const domain of domains) {
- divs.push(
- div({class: 'domain'},
- div({class: 'block'},
- parse(domain)
- ),
- button({class: 'edit', onclick: (event) => {
- console.log(event.target.parentElement)
- let domain = event
- .target
- .parentElement
- .getElementsByClassName('block')[0]
- .innerText
-
- if (!is_domain(domain)) {
- alert("Invalid domain")
- return
- }
-
- location.href = '/domain?domain='+domain
- }},
- parse("Edit")
- ),
- button({class: 'delete', onclick: async () => {
- let res = await del_domain(domain)
-
- if (res.status != 204) {
- alert(res.msg)
- return
- }
-
- location.reload()
- }},
- parse("Delete")
- )
- )
- )
- }
- return divs
-}
-
-async function init() {
-
- let res = await domains();
-
- if (res.status !== 200) {
- alert(res.msg)
- return
- }
-
- render(res.json)
-
-}
-
-init() \ No newline at end of file
diff --git a/public/js/login.js b/public/js/login.js
deleted file mode 100644
index 3bd64ad..0000000
--- a/public/js/login.js
+++ /dev/null
@@ -1,44 +0,0 @@
-import { body, div, form, input, p, parse, span} from './main.js'
-import { login } from './api.js'
-
-function render() {
- document.body.replaceWith(
- body({},
- div({id: 'login', class: 'fill'},
- span({id: 'logo'},
- span({class: 'accent'}, parse('Wrapper'))
- ),
- form({autocomplete: "off"},
- input({
- type: 'text',
- name: 'user',
- id: 'user',
- placeholder: 'Username',
- autofocus: 1
- }),
- input({
- type: 'password',
- name: 'pass',
- id: 'pass',
- placeholder: 'Password',
- onkeydown: async (event) => {
- if (event.key == 'Enter') {
- event.preventDefault()
- let user = document.getElementById('user').value
- let pass = document.getElementById('pass').value
-
- let res = await login(user, pass)
-
- if (res.status === 200) {
- location.href = '/home'
- }
- }
- }
- })
- )
- )
- )
- )
-}
-
-render()
diff --git a/public/js/main.js b/public/js/main.js
deleted file mode 100644
index 615b3d6..0000000
--- a/public/js/main.js
+++ /dev/null
@@ -1,136 +0,0 @@
-function createElement(name, attrs, ...children) {
- const el = document.createElement(name);
-
- for (const attr in attrs) {
- if(attr.startsWith("on")) {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr])
- }
- }
-
- for (const child of children) {
- if (child == null) {
- continue
- }
- el.appendChild(child)
- }
-
- return el
-}
-
-export function createElementNS(name, attrs, ...children) {
- var svgns = "http://www.w3.org/2000/svg";
- var el = document.createElementNS(svgns, name);
-
- for (const attr in attrs) {
- if(attr.startsWith("on")) {
- el[attr] = attrs[attr];
- } else {
- el.setAttribute(attr, attrs[attr])
- }
- }
-
- for (const child of children) {
- if (child == null) {
- continue
- }
- el.appendChild(child)
- }
-
- return el
-}
-
-export function p(attrs, ...children) {
- return createElement("p", attrs, ...children)
-}
-
-export function span(attrs, ...children) {
- return createElement("span", attrs, ...children)
-}
-
-export function div(attrs, ...children) {
- return createElement("div", attrs, ...children)
-}
-
-export function a(attrs, ...children) {
- return createElement("a", attrs, ...children)
-}
-
-export function i(attrs, ...children) {
- return createElement("i", attrs, ...children)
-}
-
-export function form(attrs, ...children) {
- return createElement("form", attrs, ...children)
-}
-
-export function img(alt, attrs, ...children) {
- attrs['onerror'] = (event) => event.target.remove()
- attrs['alt'] = alt
- return createElement("img", attrs, ...children)
-}
-
-export function input(attrs, ...children) {
- return createElement("input", attrs, ...children)
-}
-
-export function button(attrs, ...children) {
- return createElement("button", attrs, ...children)
-}
-
-export function path(attrs, ...children) {
- return createElementNS("path", attrs, ...children)
-}
-
-export function svg(attrs, ...children) {
- return createElementNS("svg", attrs, ...children)
-}
-
-export function body(attrs, ...children) {
- return createElement("body", attrs, ...children)
-}
-
-export function textarea(attrs, ...children) {
- return createElement("textarea", attrs, ...children)
-}
-
-export function parse(input) {
- const pattern = /^[ a-zA-Z0-9!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]*$/;
-
- input = input + '';
-
- if (!pattern.test(input)) {
- return null;
- }
-
- const sanitized = input.replace(/</g, '&lt;').replace(/>/g, '&gt;');
- return document.createRange().createContextualFragment(sanitized);
-}
-
-export function is_domain(domain) {
- domain = domain.toLowerCase()
-
- const pattern = /^[a-z0-9_\-.]*$/;
- if (!pattern.test(domain)) {
- return false
- }
-
- let parts = domain.split('.').reverse()
- for (const part of parts) {
- if (part.length < 1) {
- return false
- }
- }
-
- if (parts.length < 2 || parts[0].length < 2) {
- return false
- }
-
- const tld_pattern = /^[a-z]*$/;
- if (!tld_pattern.test(parts[0])) {
- return false
- }
-
- return true
-} \ No newline at end of file