A lot of stuff
This commit is contained in:
parent
a1c9b30cf6
commit
ad969e5807
13 changed files with 227 additions and 167 deletions
|
@ -29,7 +29,6 @@
|
|||
}
|
||||
|
||||
#header {
|
||||
border-bottom: var(--dark-2) solid 2px;
|
||||
width: calc(100% - 30px);
|
||||
|
||||
}
|
||||
|
|
28
src/lib/components/Form.svelte
Normal file
28
src/lib/components/Form.svelte
Normal file
|
@ -0,0 +1,28 @@
|
|||
<script>
|
||||
import Area from '$lib/components/Area.svelte';
|
||||
import { handleSubmit } from '$lib/util.js';
|
||||
|
||||
export let form = {};
|
||||
export let action = '/';
|
||||
export let name = 'Empty form';
|
||||
|
||||
let submitFunc = async e => form = JSON.parse(await handleSubmit(e))
|
||||
</script>
|
||||
|
||||
<Area handleSubmit=''>
|
||||
<span slot="header">
|
||||
{name}
|
||||
</span>
|
||||
|
||||
<span slot='main'>
|
||||
<form action={action} on:submit|preventDefault={submitFunc} method='POST'>
|
||||
<slot></slot>
|
||||
</form>
|
||||
</span>
|
||||
<p slot="footer">
|
||||
{#if form?.success}
|
||||
<p>{form?.success}</p>
|
||||
{/if}
|
||||
By using the Sanifae service, you agree to the <a href='/tos'>Terms of Service</a>.
|
||||
</p>
|
||||
</Area>
|
|
@ -70,6 +70,7 @@
|
|||
width: 50px;
|
||||
height: 50px;
|
||||
margin-right: 10px;
|
||||
border-radius: 100%;
|
||||
}
|
||||
|
||||
.date {
|
||||
|
@ -94,7 +95,7 @@
|
|||
{:else}
|
||||
<Area>
|
||||
<span slot="header" id='header'>
|
||||
<img class='pfp' src='/pfp/{username}.png'/>
|
||||
<img class='pfp' src='/img/pfp/{username}.png'/>
|
||||
<div class='header-area'>
|
||||
<div><a href='/users/{username}'>
|
||||
{username}
|
||||
|
|
|
@ -1,4 +1,5 @@
|
|||
import { backend } from './handlers.js';
|
||||
import { mkdir, access } from 'node:fs/promises';
|
||||
|
||||
const AUTH_ACTIONS = [
|
||||
'postCreate',
|
||||
|
@ -9,24 +10,79 @@ const AUTH_ACTIONS = [
|
|||
'follow'
|
||||
];
|
||||
|
||||
const FILE_DIRS = [
|
||||
'/db',
|
||||
'/db/files/upload',
|
||||
'/db/files/pfp'
|
||||
]
|
||||
|
||||
import sqlite3 from 'sqlite3'
|
||||
import { open } from 'sqlite'
|
||||
|
||||
var db;
|
||||
|
||||
async function newDir(dir) {
|
||||
await access(newDir)
|
||||
.then(() => {})
|
||||
.catch(async () => await mkdir(dir, { recursive: true }));
|
||||
}
|
||||
|
||||
async function initFolders() {
|
||||
for (var i = 0; i < FILE_DIRS.length; i++) {
|
||||
await newDir( `${process.cwd()}/${FILE_DIRS[i]}`);
|
||||
}
|
||||
}
|
||||
|
||||
async function initDb() {
|
||||
await initFolders();
|
||||
|
||||
db = await open({
|
||||
filename: `${process.cwd()}/db/main.db`,
|
||||
driver: sqlite3.Database
|
||||
});
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS auth (username CHAR(64), password CHAR(1024))');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS token (username CHAR(64), token CHAR(1024))');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS post (username CHAR(64), id CHAR(64), content CHAR(10240), upvotes INTEGER, downvotes INTEGER, rating REAL, reply CHAR(64), time INTEGER)');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS vote (id CHAR(64), username CHAR(64), type INTEGER)');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS user (username CHAR(64), followers INTEGER, following INTEGER, upvotes INTEGER, downvotes INTEGER, reputation REAL)');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS bio (username CHAR(64), content CHAR(10240), roles INTEGER)');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS follow (username CHAR(64), following CHAR(64))');
|
||||
await db.run('CREATE TABLE IF NOT EXISTS auth ( \
|
||||
username CHAR(64), \
|
||||
password CHAR(1024) \
|
||||
)');
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS token ( \
|
||||
username CHAR(64), \
|
||||
token CHAR(1024) \
|
||||
)');
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS post ( \
|
||||
username CHAR(64), \
|
||||
id CHAR(64), \
|
||||
content CHAR(10240), \
|
||||
upvotes INTEGER, \
|
||||
downvotes INTEGER, \
|
||||
rating REAL, \
|
||||
reply CHAR(64), \
|
||||
time INTEGER \
|
||||
)');
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS vote ( \
|
||||
id CHAR(64), \
|
||||
username CHAR(64), \
|
||||
type INTEGER \
|
||||
)');
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS user ( \
|
||||
username CHAR(64), \
|
||||
followers INTEGER, \
|
||||
following INTEGER, \
|
||||
upvotes INTEGER, \
|
||||
downvotes INTEGER, \
|
||||
reputation REAL, \
|
||||
roles INTEGER, \
|
||||
pinned CHAR(64) \
|
||||
)');
|
||||
|
||||
await db.run('CREATE TABLE IF NOT EXISTS follow (\
|
||||
username CHAR(64), \
|
||||
following CHAR(64) \
|
||||
)');
|
||||
}
|
||||
|
||||
let backendProxy = async ({route, backendParams}) => {
|
||||
|
|
|
@ -84,9 +84,9 @@ let fileCreate = (type) => {
|
|||
if (validExtensions.indexOf(extensionSafe) == -1)
|
||||
return { success: 'Illegal file extension. Permitted file extensions are: ' + validExtensions.join(', ') };
|
||||
|
||||
let fileName = (type == 'post') ? `post-${imgHash}.${extensionSafe}` : `pfp-${user}.png`
|
||||
let fileName = (type == 'post') ? `upload/${imgHash}.${extensionSafe}` : `pfp/${user}.png`
|
||||
|
||||
writeFile(`${process.cwd()}/db/${fileName}`,imgData,{encoding: 'base64'});
|
||||
writeFile(`${process.cwd()}/db/files/${fileName}`,imgData,{encoding: 'base64'});
|
||||
|
||||
return { success: 'Successfully uploaded file.', 'href': `/img/${imgHash}.${extensionSafe}`};
|
||||
}
|
||||
|
@ -98,7 +98,7 @@ backend.fileCreate = fileCreate('post');
|
|||
backend.pfp = fileCreate('pfp');
|
||||
|
||||
backend.userRoles = async ({user},{db}) => {
|
||||
var rolesLocal = await db.all('SELECT roles from bio WHERE username = ?', [
|
||||
var rolesLocal = await db.all('SELECT roles from user WHERE username = ?', [
|
||||
user
|
||||
] );
|
||||
|
||||
|
@ -135,7 +135,7 @@ backend.register = async ({user, pass, pass2},{db}) => {
|
|||
passHash
|
||||
])
|
||||
|
||||
await updateUser({user: user});
|
||||
await updateUser({user: user}, {db});
|
||||
|
||||
return { success: 'Successfully created account.', location: '/'};
|
||||
}
|
||||
|
@ -236,21 +236,9 @@ backend.userGet = async ({user},{db}) => {
|
|||
|
||||
if (!followers) followers = [];
|
||||
|
||||
return {data: posts[0], following, followers};
|
||||
}
|
||||
posts[0].rolesArr = await backend.userRoles({user},{db});
|
||||
|
||||
backend.userBio = async ({user},{db}) => {
|
||||
var posts = await db.all('SELECT * from bio WHERE username = ?', [
|
||||
user
|
||||
])
|
||||
|
||||
if (!posts || posts.length < 1) {
|
||||
return {'success': 'Bio does not exist.'}
|
||||
}
|
||||
|
||||
posts[0].rolesArr = (await userRoles({user})) || [];
|
||||
|
||||
return {data: posts[0]};
|
||||
return {data: posts[0], following, followers };
|
||||
}
|
||||
|
||||
backend.postBulk = async ({page, id, user, cookies, sort, type}, {admin, db}) => {
|
||||
|
@ -264,11 +252,14 @@ backend.postBulk = async ({page, id, user, cookies, sort, type}, {admin, db}) =>
|
|||
|
||||
sort = sort.replaceAll('%d',Math.floor(new Date() * 1000));
|
||||
|
||||
let pageParams = [
|
||||
page*ROW_COUNT,
|
||||
ROW_COUNT
|
||||
]
|
||||
|
||||
if (type == 'all') {
|
||||
posts = await db.all('SELECT * from post ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||
page*ROW_COUNT,
|
||||
ROW_COUNT
|
||||
...pageParams
|
||||
])
|
||||
} else if (type == 'post') {
|
||||
posts = await db.all('SELECT * from post WHERE id = ?', [
|
||||
|
@ -279,21 +270,18 @@ backend.postBulk = async ({page, id, user, cookies, sort, type}, {admin, db}) =>
|
|||
|
||||
posts.push(...(await db.all('SELECT * from post WHERE reply = ? ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||
id,
|
||||
page*ROW_COUNT,
|
||||
ROW_COUNT
|
||||
...pageParams
|
||||
])))
|
||||
|
||||
} else if (type == 'user') {
|
||||
posts = await db.all('SELECT * from post WHERE username = ? ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||
user,
|
||||
page*ROW_COUNT,
|
||||
ROW_COUNT
|
||||
...pageParams
|
||||
])
|
||||
} else if (type == 'follow') {
|
||||
posts = await db.all('SELECT * from post WHERE username IN (SELECT following from follow WHERE username = ?) ORDER BY '+sort+' DESC LIMIT ?, ?', [
|
||||
userAuth,
|
||||
page*ROW_COUNT,
|
||||
ROW_COUNT
|
||||
...pageParams
|
||||
])
|
||||
}
|
||||
|
||||
|
@ -346,7 +334,7 @@ backend.vote = async ({id, vote}, {user, db}) => {
|
|||
if (!user[0])
|
||||
return {success: 'fail' };
|
||||
|
||||
await updateUser({user: user[0].username});
|
||||
await updateUser({user: user[0].username}, {db});
|
||||
|
||||
return {data: {up,down}};
|
||||
}
|
||||
|
|
|
@ -87,7 +87,7 @@ let formatPost = function(post) {
|
|||
|
||||
extension = safeName(extension);
|
||||
|
||||
splitPost = {'type': EXTENSION_MAP[extension] || 'none', 'url': `/img/${matchCleaned}`};
|
||||
splitPost = {'type': EXTENSION_MAP[extension] || 'none', 'url': `/img/file/${matchCleaned}`};
|
||||
|
||||
return splitPost;
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue