change psql-lib from knex to postgres.js
This commit is contained in:
@ -1,4 +1,4 @@
|
||||
import sql from "../sql.mjs";
|
||||
import db from "../sql.mjs";
|
||||
import lib from "../lib.mjs";
|
||||
import { exec } from "child_process";
|
||||
import search from "../routeinc/search.mjs";
|
||||
@ -24,20 +24,26 @@ export default (router, tpl) => {
|
||||
});
|
||||
|
||||
router.post(/^\/login(\/)?$/, async (req, res) => {
|
||||
const user = await sql("user").where("login", req.post.username.toLowerCase()).limit(1);
|
||||
const user = await db`
|
||||
select *
|
||||
from "user"
|
||||
where "login" = ${req.post.username.toLowerCase()}
|
||||
limit 1
|
||||
`;
|
||||
if(user.length === 0)
|
||||
return res.reply({ body: "user doesn't exist or wrong password" });
|
||||
if(!(await lib.verify(req.post.password, user[0].password)))
|
||||
return res.reply({ body: "user doesn't exist or wrong password" });
|
||||
const stamp = ~~(Date.now() / 1e3);
|
||||
|
||||
await sql("user_sessions") // delete unused sessions
|
||||
.where('last_action', '<=', (Date.now() - 6048e5))
|
||||
.andWhere('kmsi', 0)
|
||||
.del();
|
||||
await db`
|
||||
delete from user_sessions
|
||||
where last_action <= ${(Date.now() - 6048e5)}
|
||||
and kmsi = 0
|
||||
`;
|
||||
|
||||
const session = lib.md5(lib.createID());
|
||||
await sql("user_sessions").insert({
|
||||
const blah = {
|
||||
user_id: user[0].id,
|
||||
session: lib.md5(session),
|
||||
browser: req.headers["user-agent"],
|
||||
@ -45,7 +51,13 @@ export default (router, tpl) => {
|
||||
last_used: stamp,
|
||||
last_action: "/login",
|
||||
kmsi: typeof req.post.kmsi !== 'undefined' ? 1 : 0
|
||||
});
|
||||
};
|
||||
|
||||
await db`
|
||||
insert into "user_sessions" ${
|
||||
db(blah, 'user_id', 'session', 'browser', 'created_at', 'last_used', 'last_action', 'kmsi')
|
||||
}
|
||||
`;
|
||||
|
||||
return res.writeHead(301, {
|
||||
"Cache-Control": "no-cache, public",
|
||||
@ -55,11 +67,18 @@ export default (router, tpl) => {
|
||||
});
|
||||
|
||||
router.get(/^\/logout$/, auth, async (req, res) => {
|
||||
const usersession = await sql("user_sessions").where("id", req.session.sess_id);
|
||||
const usersession = await db`
|
||||
select *
|
||||
from "user_sessions"
|
||||
where id = ${+req.session.sess_id}
|
||||
`;
|
||||
if(usersession.length === 0)
|
||||
return res.reply({ body: "nope 2" });
|
||||
|
||||
await sql("user_sessions").where("id", req.session.sess_id).del();
|
||||
await db`
|
||||
delete from "user_sessions"
|
||||
where id = ${+req.session.sess_id}
|
||||
`;
|
||||
return res.writeHead(301, {
|
||||
"Cache-Control": "no-cache, public",
|
||||
"Set-Cookie": "session=; Path=/; Expires=Thu, 01 Jan 1970 00:00:00 GMT",
|
||||
@ -86,10 +105,12 @@ export default (router, tpl) => {
|
||||
});
|
||||
|
||||
router.get(/^\/admin\/sessions(\/)?$/, auth, async (req, res) => {
|
||||
const rows = await sql("user_sessions")
|
||||
.leftJoin("user", "user.id", "user_sessions.user_id")
|
||||
.select("user_sessions.*", "user.user")
|
||||
.orderBy("user_sessions.last_used", "desc");
|
||||
const rows = await db`
|
||||
select "user_sessions".*, "user".user
|
||||
from "user_sessions"
|
||||
left join "user" on "user".id = "user_sessions".user_id
|
||||
order by "user_sessions".last_used desc
|
||||
`;
|
||||
|
||||
res.reply({
|
||||
body: tpl.render("admin/sessions", {
|
||||
@ -108,17 +129,22 @@ export default (router, tpl) => {
|
||||
|
||||
if(tag.startsWith('src:')) {
|
||||
tag = tag.substring(4);
|
||||
ret = await sql('items')
|
||||
.where('src', 'ilike', '%'+tag+'%')
|
||||
.limit(500);
|
||||
ret = await db`
|
||||
select *
|
||||
from "items"
|
||||
where src ilike ${'%' + tag + '%'}
|
||||
limit 500
|
||||
`;
|
||||
}
|
||||
else {
|
||||
rows = await sql("tags")
|
||||
.select("items.id", "items.username", "tags.tag")
|
||||
.leftJoin("tags_assign", "tags_assign.tag_id", "tags.id")
|
||||
.leftJoin("items", "items.id", "tags_assign.item_id")
|
||||
.where("tags.tag", "like", '%'+tag+'%')
|
||||
.limit(500);
|
||||
rows = await db`
|
||||
select "items".id, "items".username, "tags".tag
|
||||
from "tags"
|
||||
left join "tags_assign" on "tags_assign".tag_id = "tags".id
|
||||
left join "items" on "items".id = "tags_assign".item_id
|
||||
where "tags".tag ilike ${'%' + tag + '%'}
|
||||
limit 500
|
||||
`;
|
||||
ret = search(rows, tag);
|
||||
}
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
import sql from '../../sql.mjs';
|
||||
import db from '../../sql.mjs';
|
||||
import lib from '../../lib.mjs';
|
||||
import search from '../../routeinc/search.mjs';
|
||||
|
||||
@ -13,11 +13,14 @@ export default router => {
|
||||
const user = req.url.split[3] === "user" ? req.url.split[4] : "%";
|
||||
const mime = (allowedMimes.filter(n => req.url.split[3]?.startsWith(n))[0] ? req.url.split[3] : "") + "%";
|
||||
|
||||
const rows = await sql("items")
|
||||
.orderByRaw("rand()")
|
||||
.limit(1)
|
||||
.where("mime", "ilike", mime)
|
||||
.andWhere("username", "ilike", user);
|
||||
const rows = await db`
|
||||
select *
|
||||
from "items"
|
||||
where mime ilike ${mime}
|
||||
and username ilike ${user}
|
||||
order by random()
|
||||
limit 1
|
||||
`;
|
||||
|
||||
return res.json({
|
||||
success: rows.length > 0,
|
||||
@ -29,7 +32,13 @@ export default router => {
|
||||
let eps = 100;
|
||||
let id = +req.url.split[3];
|
||||
|
||||
const rows = await sql("items").where("id", "<", id).orderBy("id", "desc").limit(eps);
|
||||
const rows = await db`
|
||||
select *
|
||||
from "items"
|
||||
where id < ${+id}
|
||||
order by id desc
|
||||
limit ${+eps}
|
||||
`;
|
||||
|
||||
const items = {
|
||||
items: rows,
|
||||
@ -45,9 +54,26 @@ export default router => {
|
||||
group.get(/\/item\/[0-9]+$/, async (req, res) => {
|
||||
const id = +req.url.split[3];
|
||||
|
||||
const item = await sql("items").where("id", id).limit(1);
|
||||
const next = await sql("items").select("id").where("id", ">", id).orderBy("id").limit(1);
|
||||
const prev = await sql("items").select("id").where("id", "<", id).orderBy("id", "desc").limit(1);
|
||||
const item = await db`
|
||||
select *
|
||||
from "items"
|
||||
where id = ${+id}
|
||||
limit 1
|
||||
`;
|
||||
const next = await db`
|
||||
select id
|
||||
from "items"
|
||||
where id > ${+id}
|
||||
order by id
|
||||
limit 1
|
||||
`;
|
||||
const prev = await db`
|
||||
select id
|
||||
from "items"
|
||||
where id < ${+id}
|
||||
order by id desc
|
||||
limit 1
|
||||
`;
|
||||
|
||||
if(item.length === 0) {
|
||||
return res.json({
|
||||
@ -74,11 +100,13 @@ export default router => {
|
||||
const user = req.url.split[3];
|
||||
const eps = +req.url.split[4] || 50;
|
||||
|
||||
const rows = await sql("items")
|
||||
.select("id", "mime", "size", "src", "stamp", "userchannel", "username", "usernetwork")
|
||||
.where("username", user)
|
||||
.orderBy("stamp", "desc")
|
||||
.limit(eps);
|
||||
const rows = db`
|
||||
select id, mime, size, src, stamp, userchannel, username, usernetwork
|
||||
from "items"
|
||||
where username = ${user}
|
||||
order by stamp desc
|
||||
limit ${+eps}
|
||||
`;
|
||||
|
||||
return res.json({
|
||||
success: rows.length > 0,
|
||||
@ -109,11 +137,12 @@ export default router => {
|
||||
}, 405); // method not allowed
|
||||
}
|
||||
|
||||
const tmptag = (
|
||||
await sql('tags')
|
||||
.where('tag', tagname)
|
||||
.limit(1)
|
||||
)[0];
|
||||
const tmptag = (await db`
|
||||
select *
|
||||
from "tags"
|
||||
where tag = ${tagname}
|
||||
limit 1
|
||||
`)[0];
|
||||
|
||||
if(!tmptag) {
|
||||
return res.json({
|
||||
@ -122,13 +151,15 @@ export default router => {
|
||||
}, 404); // not found
|
||||
}
|
||||
|
||||
const q = (
|
||||
await sql('tags')
|
||||
.update({
|
||||
tag: newtag
|
||||
}, [ 'tag', 'normalized' ])
|
||||
.where('tag', tagname)
|
||||
)?.[0];
|
||||
const q = (await db`
|
||||
update "tags" set ${
|
||||
db({
|
||||
tag: newtag
|
||||
}, 'tag')
|
||||
}
|
||||
where tag = ${tagname}
|
||||
returning *
|
||||
`)?.[0];
|
||||
|
||||
return res.json(q, tagname === newtag ? 200 : 201); // created (modified)
|
||||
});
|
||||
@ -147,13 +178,15 @@ export default router => {
|
||||
}
|
||||
|
||||
try {
|
||||
const q = await sql('tags')
|
||||
.select('tag', sql.raw('count(tags_assign.tag_id) as tagged'))
|
||||
.leftJoin('tags_assign', 'tags_assign.tag_id', 'tags.id')
|
||||
.whereRaw("normalized like '%' || slugify(?) || '%'", [ searchString ])
|
||||
.groupBy('tags.id')
|
||||
.orderBy('tagged', 'desc')
|
||||
.limit(15);
|
||||
const q = await db`
|
||||
select tag, count(tags_assign.tag_id) as tagged
|
||||
from "tags"
|
||||
left join "tags_assign" on "tags_assign".tag_id = "tags".id
|
||||
where normalized like '%' || slugify(${searchString}) || '%'
|
||||
group by "tags".id
|
||||
order by tagged desc
|
||||
limit 15
|
||||
`;
|
||||
reply.success = true;
|
||||
reply.suggestions = search(q, searchString);
|
||||
} catch(err) {
|
||||
@ -172,7 +205,10 @@ export default router => {
|
||||
}
|
||||
const postid = +req.post.postid;
|
||||
|
||||
await sql("items").where("id", postid).del();
|
||||
await db`
|
||||
delete from "items"
|
||||
where id = ${+postid}
|
||||
`;
|
||||
|
||||
res.json({
|
||||
success: true
|
||||
@ -182,25 +218,39 @@ export default router => {
|
||||
group.post(/\/admin\/togglefav$/, lib.auth, async (req, res) => {
|
||||
const postid = +req.post.postid;
|
||||
|
||||
let favs = await sql('favorites').select('user_id').where('item_id', postid);
|
||||
let favs = await db`
|
||||
select user_id
|
||||
from "favorites"
|
||||
where item_id = ${+postid}
|
||||
`;
|
||||
|
||||
if(Object.values(favs).filter(u => u.user_id === req.session.id)[0]) {
|
||||
// del fav
|
||||
await sql('favorites').where('user_id', req.session.id).andWhere('item_id', postid).del();
|
||||
await db`
|
||||
delete from "favorites"
|
||||
where user_id = ${+req.session.id}
|
||||
and item_id = ${+postid}
|
||||
`;
|
||||
}
|
||||
else {
|
||||
// add fav
|
||||
await sql('favorites').insert({
|
||||
item_id: postid,
|
||||
user_id: req.session.id
|
||||
});
|
||||
await db`
|
||||
insert into "favorites" ${
|
||||
db({
|
||||
item_id: +postid,
|
||||
user_id: +req.session.id
|
||||
}, 'item_id', 'user_id')
|
||||
}
|
||||
`;
|
||||
}
|
||||
|
||||
favs = await sql('favorites')
|
||||
.select('user.user', 'user_options.avatar')
|
||||
.leftJoin('user', 'user.id', 'favorites.user_id')
|
||||
.leftJoin('user_options', 'user_options.user_id', 'favorites.user_id')
|
||||
.where('favorites.item_id', postid);
|
||||
favs = await db`
|
||||
select "user".user, "user_options".avatar
|
||||
from "favorites"
|
||||
left join "user" on "user".id = "favorites".user_id
|
||||
left join "user_options" on "user_options".user_id = "favorites".user_id
|
||||
where "favorites".item_id = ${+postid}
|
||||
`;
|
||||
|
||||
return res.json({
|
||||
success: true,
|
||||
|
@ -1,4 +1,4 @@
|
||||
import sql from '../../sql.mjs';
|
||||
import db from '../../sql.mjs';
|
||||
import lib from '../../lib.mjs';
|
||||
|
||||
export default router => {
|
||||
@ -13,11 +13,11 @@ export default router => {
|
||||
|
||||
const avatar = +req.post.avatar;
|
||||
|
||||
const itemid = (
|
||||
await sql('items')
|
||||
.select('id')
|
||||
.where('id', avatar)
|
||||
)?.[0]?.id;
|
||||
const itemid = (await db`
|
||||
select id
|
||||
from "items"
|
||||
where id = ${+avatar}
|
||||
`)?.[0]?.id;
|
||||
|
||||
if(!itemid) {
|
||||
return res.json({
|
||||
@ -25,11 +25,14 @@ export default router => {
|
||||
}, 404); // not found
|
||||
}
|
||||
|
||||
const q = await sql('user_options')
|
||||
.update({
|
||||
avatar
|
||||
})
|
||||
.where('user_id', req.session.id);
|
||||
const q = await db`
|
||||
update "user_options" set ${
|
||||
db({
|
||||
avatar
|
||||
}, 'avatar')
|
||||
}
|
||||
where user_id = ${+req.session.id}
|
||||
`;
|
||||
|
||||
return res.json({
|
||||
msg: q
|
||||
|
@ -1,4 +1,4 @@
|
||||
import sql from '../../sql.mjs';
|
||||
import db from '../../sql.mjs';
|
||||
import lib from '../../lib.mjs';
|
||||
|
||||
export default router => {
|
||||
@ -38,22 +38,31 @@ export default router => {
|
||||
}
|
||||
|
||||
try {
|
||||
let tagid = (
|
||||
await sql("tags")
|
||||
.select("id")
|
||||
.whereRaw("normalized = slugify(?)", [ tagname ])
|
||||
)?.[0]?.id;
|
||||
let tagid = (await db`
|
||||
select id
|
||||
from "tags"
|
||||
where normalized = slugify(${tagname})
|
||||
`)?.[0]?.id;
|
||||
|
||||
if(!tagid) { // create new tag
|
||||
tagid = (await sql("tags").returning("id").insert({
|
||||
tag: tagname
|
||||
}))[0];
|
||||
tagid = (await db`
|
||||
insert into "tags" ${
|
||||
db({
|
||||
tag: tagname
|
||||
}, 'tag')
|
||||
}
|
||||
returning id
|
||||
`)[0];
|
||||
}
|
||||
await sql("tags_assign").insert({
|
||||
tag_id: tagid,
|
||||
item_id: postid,
|
||||
user_id: req.session.id
|
||||
});
|
||||
await db`
|
||||
insert into "tags_assign" ${
|
||||
db({
|
||||
tag_id: +tagid,
|
||||
item_id: +postid,
|
||||
user_id: +req.session.id
|
||||
}, 'tag_id', 'item_id', 'user_id')
|
||||
}
|
||||
`;
|
||||
} catch(err) {
|
||||
return res.json({
|
||||
success: false,
|
||||
@ -83,20 +92,27 @@ export default router => {
|
||||
|
||||
if(!(await lib.getTags(postid)).filter(tag => [1,2].includes(tag.id)).length) {
|
||||
// insert
|
||||
await sql('tags_assign').insert({
|
||||
item_id: postid,
|
||||
tag_id: 1,
|
||||
user_id: req.session.id
|
||||
});
|
||||
await db`
|
||||
insert into "tags_assign" ${
|
||||
db({
|
||||
item_id: +postid,
|
||||
tag_id: 1,
|
||||
user_id: +req.session.id
|
||||
}, 'item_id', 'tag_id', 'user_id')
|
||||
}
|
||||
`;
|
||||
}
|
||||
else {
|
||||
// update
|
||||
await sql('tags_assign')
|
||||
.update({
|
||||
tag_id: sql.raw('(array[2,1])[tag_id]')
|
||||
})
|
||||
.whereRaw('tag_id = any(array[1,2])')
|
||||
.andWhere('item_id', postid);
|
||||
await db`
|
||||
update "tags_assign" set ${
|
||||
db({
|
||||
tag_id: db`(array[2,1])[tag_id]`
|
||||
}, tag_id)
|
||||
}
|
||||
where tag_id = any(array[1,2])
|
||||
and item_id = ${+postid}
|
||||
`;
|
||||
}
|
||||
|
||||
return res.json({
|
||||
@ -129,10 +145,16 @@ export default router => {
|
||||
});
|
||||
}
|
||||
|
||||
let q = sql("tags_assign").where("tag_id", tagid).andWhere("item_id", postid).del();
|
||||
if(req.session.level < 50)
|
||||
q = q.andWhere("user_id", req.session.id);
|
||||
const reply = !!(await q);
|
||||
let q = await db`
|
||||
delete from "tags_assign"
|
||||
where tag_id = ${+tagid}
|
||||
and item_id = ${+postid}
|
||||
${ req.session.level < 50
|
||||
? db`and user_id = ${+req.session.id}`
|
||||
: db``
|
||||
}
|
||||
`;
|
||||
const reply = !!q;
|
||||
|
||||
return res.json({
|
||||
success: reply,
|
||||
|
@ -1,5 +1,5 @@
|
||||
import cfg from "../config.mjs";
|
||||
import sql from "../sql.mjs";
|
||||
import db from "../sql.mjs";
|
||||
import lib from "../lib.mjs";
|
||||
import f0cklib from "../routeinc/f0cklib.mjs";
|
||||
|
||||
@ -49,37 +49,52 @@ export default (router, tpl) => {
|
||||
referer = referertmp.split("/").slice(3).join("/");
|
||||
|
||||
if(cfg.allowedModes[mode]) {
|
||||
await sql("user_options")
|
||||
.insert({
|
||||
user_id: req.session.id,
|
||||
mode: mode,
|
||||
theme: req.theme ?? "f0ck"
|
||||
})
|
||||
.onConflict("user_id")
|
||||
.merge();
|
||||
const blah = {
|
||||
user_id: req.session.id,
|
||||
mode: mode,
|
||||
theme: req.theme ?? "f0ck"
|
||||
};
|
||||
|
||||
await db`
|
||||
insert into "user_options" ${
|
||||
db(blah, 'user_id', 'mode', 'theme')
|
||||
}
|
||||
on conflict ("user_id") do update set
|
||||
mode = excluded.mode,
|
||||
theme = excluded.theme,
|
||||
user_id = excluded.user_id
|
||||
`;
|
||||
}
|
||||
res.redirect(`/${referer}`);
|
||||
});
|
||||
|
||||
router.get(/^\/ranking$/, async (req, res) => {
|
||||
try {
|
||||
const list = await sql('tags_assign')
|
||||
.select('user.user', sql.raw('coalesce(user_options.avatar, 47319) as avatar'))
|
||||
.leftJoin('user', 'user.id', 'tags_assign.user_id')
|
||||
.leftJoin('user_options', 'user_options.user_id', 'user.id')
|
||||
.groupBy('user.user', 'user_options.avatar')
|
||||
.orderBy('count', 'desc')
|
||||
.countDistinct('tag_id', 'item_id', { as: 'count' });
|
||||
|
||||
const list = await db`
|
||||
select
|
||||
"user".user,
|
||||
coalesce("user_options".avatar, 47319) as avatar,
|
||||
count(distinct(tag_id, item_id)) as count
|
||||
from "tags_assign"
|
||||
left join "user" on "user".id = "tags_assign".user_id
|
||||
left join "user_options" on "user_options".user_id = "user".id
|
||||
group by "user".user, "user_options".avatar
|
||||
order by count desc
|
||||
`;
|
||||
const stats = await lib.countf0cks();
|
||||
|
||||
const hoster = await sql.with('t', sql.raw("select split_part(substring(src, position('//' in src)+2), '/', 1) part from items"))
|
||||
.from('t')
|
||||
.select('t.part')
|
||||
.count('t.part as c')
|
||||
.groupBy('t.part')
|
||||
.orderBy('c', 'desc')
|
||||
.limit(20);
|
||||
const hoster = await db`
|
||||
with t as (
|
||||
select
|
||||
split_part(substring(src, position('//' in src)+2), '/', 1) part
|
||||
from items
|
||||
)
|
||||
select t.part, count(t.part) as c
|
||||
from t
|
||||
group by t.part
|
||||
order by c desc
|
||||
limit 20
|
||||
`;
|
||||
|
||||
res.reply({
|
||||
body: tpl.render('ranking', {
|
||||
|
@ -1,4 +1,4 @@
|
||||
import sql from "../../inc/sql.mjs";
|
||||
import db from "../../inc/sql.mjs";
|
||||
|
||||
const auth = async (req, res, next) => {
|
||||
if(!req.session)
|
||||
@ -9,9 +9,16 @@ const auth = async (req, res, next) => {
|
||||
export default (router, tpl) => {
|
||||
router.group(/^\/settings/, group => {
|
||||
group.get(/$/, auth, async (req, res) => {
|
||||
const sessions = await sql("user_sessions")
|
||||
/*const sessions = await sql("user_sessions")
|
||||
.where("user_id", req.session.id)
|
||||
.orderBy("last_used", "desc");
|
||||
.orderBy("last_used", "desc");*/
|
||||
|
||||
const sessions = await db`
|
||||
select *
|
||||
from user_sessions
|
||||
where user_id = ${ +req.session.id }
|
||||
order by last_used desc
|
||||
`;
|
||||
|
||||
res.reply({
|
||||
body: tpl.render('settings', {
|
||||
|
Reference in New Issue
Block a user