Kaynağa Gözat

Fixes #24 Create new link item

isundil 1 yıl önce
ebeveyn
işleme
0090117a09
3 değiştirilmiş dosya ile 89 ekleme ve 12 silme
  1. 14 4
      router/api.js
  2. 14 0
      router/index.js
  3. 61 8
      static/public/js/uiShare.js

+ 14 - 4
router/api.js

@@ -76,9 +76,20 @@ module.exports = { register: app => {
         app.routerUtils.onApiRequest(req, res);
         if (!req.sessionObj?.accessList?.isAdmin || !req.body)
             return app.routerUtils.onBadRequest(res);
-        // FIXME
-        console.log(req.body);
-        app.routerUtils.jsonResponse(res, {});
+        let access = new AccessModel();
+        access.type = parseInt(req.body.typeId);
+        access.typeData = req.body.typeData;
+        access.accessTo = parseInt(req.body.accessToId);
+        access.accessToData = req.body.accessToData;
+        access.grant = parseInt(req.body.grant);
+        try {
+            await app.databaseHelper.insertOne(access);
+        }
+        catch (err) {
+            console.error(err);
+            return app.routerUtils.onBadRequest(res);
+        }
+        app.routerUtils.jsonResponse(res, accessToJson(access));
     });
     app.router.del("/api/accessAdmin/:id", async (req, res) => {
         app.routerUtils.onApiRequest(req, res);
@@ -94,7 +105,6 @@ module.exports = { register: app => {
         const access = (await app.databaseHelper.fetch(AccessModel, { id: parseInt(req.params.id) }))?.[0];
         if (!access)
             return app.routerUtils.onBadRequest(res);
-        access.type = parseInt(req.body.typeId);
         access.typeData = req.body.typeData;
         access.accessTo = parseInt(req.body.accessToId);
         access.accessToData = req.body.accessToData;

+ 14 - 0
router/index.js

@@ -1,5 +1,7 @@
 
 const whiskers = require('whiskers');
+const Security = require('../src/security.js');
+const { AccessModel, ACCESS_TYPE, ACCESS_TO } = require('../model/access.js');
 
 module.exports = { register: app => {
     app.router.get("/", (req, res) => {
@@ -8,5 +10,17 @@ module.exports = { register: app => {
         context.sources = [];
         res.end(whiskers.render(require('../templates/index.js'), context));
     });
+    app.router.get("/linkLogin", async (req, res) => {
+        app.routerUtils.onApiRequest(req, res);
+        if (!req.body?.link)
+            return app.routerUtils.onBadRequest(res);
+        const access = await app.databaseHelper.findOne(AccessModel, { type: ACCESS_TYPE.link, typeData: req.body.link });
+        if (access) {
+            Security.addLinkToSession(req, access.id, access.typeData);
+            if (access.accessTo == ACCESS_TO.admin)
+                Security.setAdmin(req, true);
+        }
+        app.routerUtils.redirect(res, "/");
+    });
 }};
 

+ 61 - 8
static/public/js/uiShare.js

@@ -5,7 +5,7 @@ var windowDisplayed = false;
 var data = null;
 
 const GRANT_TEXT = ["None", "Read Access", "Write Access", "Read Access (Strip meta)"];
-const GRANT_ICON = ["", "bi-eye", "bi-pencil", "bi-eye-slash"];
+const GRANT_ICON = ["bi-question-lg", "bi-eye", "bi-pencil", "bi-eye-slash"];
 const ACCESS_ICON = ["bi-question-lg", "bi-database", "bi-envelope-at", "bi-link-45deg", "bi-people"];
 const TYPE_ICON = ["bi-question-lg", "bi-diagram-2", "bi-tags", "bi-braces-asterisk", "bi-images", "bi-gear"];
 const TYPE_TEXT = ["Unknown", "Single photo", "Tags", "Meta", "Everything", "Admin access"];
@@ -19,12 +19,14 @@ class ShareData {
     grant = 0;
 
     constructor(data) {
-        this.dbId = data.id;
-        this.typeId = [ "unknown", "ldapAccount", "email", "link", "every one" ].indexOf(data.type);
-        this.typeData = data.typeData;
-        this.accessToId = [ "unknown", "item", "tag", "meta", "everything", "admin"].indexOf(data.accessTo);
-        this.accessToData = data.accessToData;
-        this.grant = [ "none", "read", "write", "read without meta"].indexOf(data.grant);
+        if (data) {
+            this.dbId = data.id;
+            this.typeId = [ "unknown", "ldapAccount", "email", "link", "every one" ].indexOf(data.type);
+            this.typeData = data.typeData;
+            this.accessToId = [ "unknown", "item", "tag", "meta", "everything", "admin"].indexOf(data.accessTo);
+            this.accessToData = data.accessToData;
+            this.grant = [ "none", "read", "write", "read without meta"].indexOf(data.grant);
+        }
     }
 
     objectify() {
@@ -57,6 +59,20 @@ function getData() {
     });
 }
 
+function createData(data) {
+    return new Promise(ok => {
+        $.ajax({
+            url: "/api/accessAdmin/create",
+            type: "POST",
+            data: data,
+            success: item => {
+                ok(new ShareData(item));
+            },
+            error: err => ok(false),
+        });
+    });
+}
+
 function updateData(data) {
     return new Promise(ok => {
         $.ajax({
@@ -139,6 +155,29 @@ async function buildShareItem(data) {
     let typeDepandentDiv = document.createElement("div");
     let grantDiv = document.createElement("div");
 
+    if (data.typeId === 3) { // Link type
+        let linkContainer = document.createElement("div");
+        linkContainer.className = "input-group";
+        let text = document.createElement("span");
+        text.className = "input-group-text bi bi-link-45deg";
+        linkContainer.appendChild(text);
+        let input = document.createElement("input");
+        input.value = `${document.location.origin}/linkLogin?link=${data.typeData}`;
+        input.className = "form-control";
+        input.type = "text";
+        input.disabled = true;
+        linkContainer.appendChild(input);
+        let bt = document.createElement("button");
+        bt.className = "btn btn-primary btn-outline-secondary";
+        bt.placeholder = "Copy"
+        let btContent = document.createElement("span");
+        btContent.className = "bi bi-clipboard-fill";
+        bt.appendChild(btContent);
+        linkContainer.appendChild(bt);
+        typeDivRow.appendChild(linkContainer);
+        bt.addEventListener("click", () => { navigator.clipboard.writeText(input.value); });
+    }
+
     {
         let typeDiv = document.createElement("div");
         typeDiv.className = "dropdown";
@@ -292,6 +331,7 @@ window.closeShareUi = () => {
     document.getElementById("pch-share-wrapper").classList.add("hidden");
     document.body.classList.remove("overlay-visible");
     windowDisplayed = false;
+    data = null;
     document.Title.pop();
 }
 
@@ -300,7 +340,20 @@ document.getElementById("pch-share-closeBt").addEventListener("click", window.cl
 
 document.getElementById("pch-share-addLdap").addEventListener("click", () => {});
 document.getElementById("pch-share-addEmail").addEventListener("click", () => {});
-document.getElementById("pch-share-addLink").addEventListener("click", () => {});
+document.getElementById("pch-share-addLink").addEventListener("click", async () => {
+    if (!windowDisplayed)
+        return;
+    const uid = crypto.randomUUID().replaceAll('-', '');
+    const container = document.getElementById('pch-share-container');
+    let share = new ShareData();
+    share.typeId = 3;
+    share.typeData = uid;
+    share.accessToId = 0;
+    share.grant = 0;
+    share = await createData(share);
+    data.push(share);
+    container.querySelector("ul").appendChild(await buildShareItem(share));
+});
 document.getElementById("pch-share-addEveryone").addEventListener("click", () => {});
 
 setTimeout(() => LoadingTasks.push(window.showShareUi), 1500);