add file stuff
This commit is contained in:
parent
c33a49e817
commit
7aac7aabdd
5 changed files with 195 additions and 26 deletions
86
index.js
86
index.js
|
|
@ -311,6 +311,28 @@ function createDb(db, structId, name) {
|
|||
return transaction();
|
||||
}
|
||||
|
||||
function getFilesForStruct(db, structureId) {
|
||||
let test = db
|
||||
.prepare("SELECT * FROM files WHERE structure_id = ? ORDER BY id DESC")
|
||||
.all(structureId);
|
||||
|
||||
console.log(db.prepare("PRAGMA table_info(files)").all());
|
||||
|
||||
return test;
|
||||
}
|
||||
|
||||
function getFile(db, fileId) {
|
||||
return db.prepare("SELECT * FROM files WHERE id = ?").get(fileId);
|
||||
}
|
||||
|
||||
function createFile(db, structure_id, name, filePath, mime_type, mime_subtype) {
|
||||
return db
|
||||
.prepare(
|
||||
"INSERT INTO files (structure_id, name, path, mime_type, mime_subtype) VALUES (?, ?, ?, ?, ?)"
|
||||
)
|
||||
.run(structure_id, name, filePath, mime_type, mime_subtype).lastInsertRowid;
|
||||
}
|
||||
|
||||
const { LRUCache } = require("lru-cache");
|
||||
const templateCache = new LRUCache({ max: 100 });
|
||||
|
||||
|
|
@ -586,8 +608,68 @@ app.get("/workshop/:structure_id/route/:id", (req, res) => {
|
|||
);
|
||||
});
|
||||
|
||||
app.get("/workshop/tip", (req, res) => {
|
||||
res.send("try entering something in the url field above");
|
||||
// POST route to handle file upload
|
||||
app.post("/workshop/:structure_id/files", (req, res) => {
|
||||
if (!req.files || Object.keys(req.files).length === 0) {
|
||||
return res.status(400).send("failed to upload that file");
|
||||
}
|
||||
|
||||
const { structure_id } = req.params;
|
||||
const file = req.files.file;
|
||||
const name = file.name;
|
||||
const [mime_type, mime_subtype] = file.mimetype.split("/");
|
||||
const uploadPath = path.join(__dirname, "public", structure_id);
|
||||
const storedPath = path.join(structure_id, file.name);
|
||||
|
||||
fs.mkdirSync(uploadPath, { recursive: true });
|
||||
|
||||
file.mv(path.join(uploadPath, name), (err) => {
|
||||
try {
|
||||
if (err) {
|
||||
return res.status(500).send(err);
|
||||
}
|
||||
|
||||
let id = createFile(
|
||||
db,
|
||||
structure_id,
|
||||
name,
|
||||
storedPath,
|
||||
mime_type,
|
||||
mime_subtype
|
||||
);
|
||||
|
||||
let file = getFile(db, id);
|
||||
file.url = prefixUrlWithHost(req, file.path);
|
||||
|
||||
return res.send(eta.render("workshop/file_detail", { file: file }));
|
||||
} catch (e) {
|
||||
res.status(500);
|
||||
return res.send(e);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
function prefixUrlWithHost(req, path) {
|
||||
return req.protocol + "://" + req.get("host") + "/" + path;
|
||||
}
|
||||
|
||||
// POST route to handle file upload
|
||||
app.get("/workshop/:structure_id/files", (req, res) => {
|
||||
const { structure_id } = req.params;
|
||||
|
||||
const files = getFilesForStruct(db, structure_id);
|
||||
files.map((it) => {
|
||||
it.url = prefixUrlWithHost(req, it.path);
|
||||
});
|
||||
|
||||
return res.send(
|
||||
bootstrapTemplateWithHTMXetc(
|
||||
eta.render("workshop/files", {
|
||||
files,
|
||||
...sidebarStuff(db, structure_id),
|
||||
})
|
||||
)
|
||||
);
|
||||
});
|
||||
|
||||
app.get("/workshop/:structure_id/new_template_modal", (req, res) => {
|
||||
|
|
|
|||
|
|
@ -37,8 +37,7 @@ CREATE TABLE templates (
|
|||
engine TEXT NOT NULL DEFAULT "eta",
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY(structure_id) REFERENCES structures(id)
|
||||
UNIQUE(name, structure_id)
|
||||
FOREIGN KEY(structure_id) REFERENCES structures(id) UNIQUE(name, structure_id)
|
||||
);
|
||||
|
||||
CREATE TABLE routes (
|
||||
|
|
@ -57,47 +56,89 @@ CREATE TABLE structure_dbs (
|
|||
db_id INTEGER,
|
||||
structure_id INTEGER,
|
||||
alias TEXT NOT NULL,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
PRIMARY KEY(db_id, structure_id),
|
||||
FOREIGN KEY(db_id) REFERENCES dbs(id),
|
||||
FOREIGN KEY(structure_id) REFERENCES structures(id)
|
||||
);
|
||||
|
||||
CREATE TABLE files (
|
||||
id INTEGER PRIMARY KEY,
|
||||
structure_id INTEGER,
|
||||
name TEXT,
|
||||
path TEXT,
|
||||
mime_type TEXT,
|
||||
mime_subtype TEXT,
|
||||
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
updated_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
|
||||
FOREIGN KEY (structure_id) REFERENCES structures(id),
|
||||
UNIQUE(path, structure_id)
|
||||
);
|
||||
|
||||
-- ===========================
|
||||
-- TRIGGERS
|
||||
-- ===========================
|
||||
|
||||
CREATE TRIGGER update_users_updated_at
|
||||
AFTER UPDATE ON users
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE users SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
|
||||
AFTER
|
||||
UPDATE
|
||||
ON users FOR EACH ROW BEGIN
|
||||
UPDATE
|
||||
users
|
||||
SET
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE
|
||||
id = OLD.id;
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER update_structures_updated_at
|
||||
AFTER UPDATE ON structures
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE structures SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
|
||||
AFTER
|
||||
UPDATE
|
||||
ON structures FOR EACH ROW BEGIN
|
||||
UPDATE
|
||||
structures
|
||||
SET
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE
|
||||
id = OLD.id;
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER update_dbs_updated_at
|
||||
AFTER UPDATE ON dbs
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE dbs SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
|
||||
AFTER
|
||||
UPDATE
|
||||
ON dbs FOR EACH ROW BEGIN
|
||||
UPDATE
|
||||
dbs
|
||||
SET
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE
|
||||
id = OLD.id;
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER update_templates_updated_at
|
||||
AFTER UPDATE ON templates
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE templates SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
|
||||
AFTER
|
||||
UPDATE
|
||||
ON templates FOR EACH ROW BEGIN
|
||||
UPDATE
|
||||
templates
|
||||
SET
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE
|
||||
id = OLD.id;
|
||||
|
||||
END;
|
||||
|
||||
CREATE TRIGGER update_routes_updated_at
|
||||
AFTER UPDATE ON routes
|
||||
FOR EACH ROW
|
||||
BEGIN
|
||||
UPDATE routes SET updated_at = CURRENT_TIMESTAMP WHERE id = OLD.id;
|
||||
AFTER
|
||||
UPDATE
|
||||
ON routes FOR EACH ROW BEGIN
|
||||
UPDATE
|
||||
routes
|
||||
SET
|
||||
updated_at = CURRENT_TIMESTAMP
|
||||
WHERE
|
||||
id = OLD.id;
|
||||
|
||||
END;
|
||||
1
views/workshop/file_detail.eta
Normal file
1
views/workshop/file_detail.eta
Normal file
|
|
@ -0,0 +1 @@
|
|||
<li><%= it.file.name %> <input value="<%= it.file.url %>"></input></li>
|
||||
42
views/workshop/files.eta
Normal file
42
views/workshop/files.eta
Normal file
|
|
@ -0,0 +1,42 @@
|
|||
<html>
|
||||
|
||||
<head>
|
||||
<link rel="stylesheet" href="/css/xp.css">
|
||||
<script src="/js/ace/ace.js" type="text/javascript" charset="utf-8"></script>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div class="flex flex-col w-full h-full window">
|
||||
<div class="title-bar">
|
||||
<div class="title-bar-text">Workshop - <%~ include('/workshop/structure_name', {structure: it.structure}) %>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex flex-row flex-grow window-body">
|
||||
<div class="w-1/5 h-full">
|
||||
<%~ include('/workshop/sidebar', it) %>
|
||||
</div>
|
||||
<div id="main-editor" class="flex flex-grow flex-col">
|
||||
<h1>Files</h1>
|
||||
<div>
|
||||
<form hx-encoding='multipart/form-data' hx-post='/workshop/<%= it.structure.id %>/files' hx-target="#files-list" hx-swap="afterbegin" _='on htmx:xhr:progress(loaded, total) set #progress.value to (loaded/total)*100'>
|
||||
<input type='file' name='file'>
|
||||
<button type="submit">
|
||||
Upload
|
||||
</button>
|
||||
<progress id='progress' value='0' max='100'></progress>
|
||||
</form>
|
||||
</div>
|
||||
<div>
|
||||
<ul id="files-list">
|
||||
<% for (let file of it.files) { %>
|
||||
<%~ include('/workshop/file_detail', { file }) %>
|
||||
<% } %>
|
||||
</ul>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</body>
|
||||
|
||||
</html>
|
||||
|
|
@ -56,5 +56,8 @@
|
|||
</ul>
|
||||
</details>
|
||||
</li>
|
||||
<li>
|
||||
<a href="/workshop/<%= it.structure.id %>/files">Files</a>
|
||||
</li>
|
||||
</ul>
|
||||
<div id="modal-zone" style="z-index: 1000000;"></div>
|
||||
Loading…
Add table
Add a link
Reference in a new issue