22 Commits
0.1.0 ... 0.2.3

Author SHA1 Message Date
09219ff798 🚀RELEASE 0.2.3
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 09:23:02 +02:00
d9cd552c89 Updated login text color 2021-08-21 09:22:48 +02:00
2b82f8798c Fixed login replace 2021-08-21 09:22:01 +02:00
d9715139cf 🚀RELEASE 0.2.2
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 09:17:36 +02:00
c731323b0b Fixxed routing links 2021-08-21 09:17:26 +02:00
0d8db9f41f 🚀RELEASE 0.2.1
Some checks failed
continuous-integration/drone/push Build is failing
2021-08-21 09:12:55 +02:00
6706c9b0d1 Static links (yay) 2021-08-21 09:12:37 +02:00
0dc6fe6704 🚀RELEASE 0.2.0
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 08:47:51 +02:00
5f82c5bef8 Removed useless console log
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 08:47:22 +02:00
47f7583659 Added comments to apiclient 2021-08-21 08:46:56 +02:00
0819dc7b5d Added comments to fix
closes #1
2021-08-21 08:40:32 +02:00
2010cc3260 No longer showing logged out users the profile pic thingy
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-21 08:38:01 +02:00
8c1a2d319b Now ignoring status on logout 2021-08-21 08:36:38 +02:00
b57aa535de Removed unused function 2021-08-21 08:35:18 +02:00
84ab757e11 More userstore fixes
ref #1
2021-08-21 08:34:54 +02:00
cd3508dcb6 Weired fucking fix for the userstore data not being instantly loaded....
ref #1
2021-08-21 08:34:33 +02:00
4f5b7f38fb First mitigations for localforage error stuff
All checks were successful
continuous-integration/drone/push Build is passing
ref #1
2021-08-21 07:43:31 +02:00
c34f45ca6f 🚀RELEASE 0.1.3
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-18 18:10:18 +02:00
b160ab04b8 Tmp fix for the build fail, for more info see: https://github.com/sveltejs/kit/issues/2230 2021-08-18 18:10:00 +02:00
c5874e16c6 🚀RELEASE 0.1.2
Some checks failed
continuous-integration/drone/push Build is failing
2021-08-18 18:02:34 +02:00
d9134f6de2 Added fix for custom basepath 2021-08-18 18:02:14 +02:00
db5c530477 🚀RELEASE 0.1.1
All checks were successful
continuous-integration/drone/push Build is passing
2021-08-18 17:53:53 +02:00
10 changed files with 174 additions and 45 deletions

View File

@@ -2,8 +2,64 @@
All notable changes to this project will be documented in this file. Dates are displayed in UTC.
#### [0.2.3](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.2...0.2.3)
- Updated login text color [`d9cd552`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/d9cd552c89415625c22c1adcb892c5a789823ce9)
- Fixed login replace [`2b82f87`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/2b82f8798cd23f15dc48a5375dc1f5ad1a3abbfd)
#### [0.2.2](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.1...0.2.2)
> 21 August 2021
- 🚀RELEASE 0.2.2 [`d971513`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/d9715139cf0c5583cb1db43953c34e3293345f68)
- Fixxed routing links [`c731323`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/c731323b0bd1b757297b601e7bbc3f5034c04e9c)
#### [0.2.1](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.2.0...0.2.1)
> 21 August 2021
- 🚀RELEASE 0.2.1 [`0d8db9f`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0d8db9f41f84ccaba3211d61e6521d57f43e1b88)
- Static links (yay) [`6706c9b`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/6706c9b0d1e396b0c6df6bb9b05d2d25c2a45cba)
#### [0.2.0](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.1.3...0.2.0)
> 21 August 2021
- Added comments to fix [`#1`](https://git.odit.services/kauft.es/linkylinky-dashboard/issues/1)
- More userstore fixes [`84ab757`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/84ab757e1159eac3cd160aac158873deaf51bb3f)
- Added comments to apiclient [`47f7583`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/47f75836597ff13a32660e03d61629ddd173f86c)
- No longer showing logged out users the profile pic thingy [`2010cc3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/2010cc326019085ca37fcdc8b8dab8445006b6fa)
- Weired fucking fix for the userstore data not being instantly loaded.... [`cd3508d`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/cd3508dcb61f165a7c83d6f0f9332f799677cb9f)
- 🚀RELEASE 0.2.0 [`0dc6fe6`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0dc6fe670498b6d1022a1ef6c4e5c4b3fcd7e352)
- First mitigations for localforage error stuff [`4f5b7f3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/4f5b7f38fb625e4da0ea3f432df958029ee8d25c)
- Now ignoring status on logout [`8c1a2d3`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/8c1a2d319b9fb6e63c3e27163392bad1becba8dd)
- Removed unused function [`b57aa53`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/b57aa535de94e22f19754b729cc6b63166a07a9d)
- Removed useless console log [`5f82c5b`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/5f82c5bef8011bd7cee853bde76433585d93b88b)
#### [0.1.3](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.1.2...0.1.3)
> 18 August 2021
- Tmp fix for the build fail, for more info see: https://github.com/sveltejs/kit/issues/2230 [`b160ab0`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/b160ab04b8324daa6389c947356bc58c865059aa)
- 🚀RELEASE 0.1.3 [`c34f45c`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/c34f45ca6f8a7fe955e8d82f0f2c10b3cdfd54ce)
#### [0.1.2](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.1.1...0.1.2)
> 18 August 2021
- 🚀RELEASE 0.1.2 [`c5874e1`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/c5874e16c60030361aedf8b7f8437a4410276f38)
- Added fix for custom basepath [`d9134f6`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/d9134f6de2f5587a57f69ad06e828d184c3480a2)
#### [0.1.1](https://git.odit.services/kauft.es/linkylinky-dashboard/compare/0.1.0...0.1.1)
> 18 August 2021
- 🚀RELEASE 0.1.1 [`db5c530`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/db5c530477f9584c77d087c3dea3c3f9156b4773)
#### 0.1.0
> 18 August 2021
- Created "master" lockfile for yarn [`76089ef`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/76089ef44eacf3ec3de4208bd02757559374c630)
- Formatting/Linting [`08520ac`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/08520ac61638df3b81aed95260bd52c710fb2dfc)
- Added link management page [`a7e4a98`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/a7e4a98b2b302dac161bccdf13cb1b769dfa01d4)
@@ -17,6 +73,7 @@ All notable changes to this project will be documented in this file. Dates are d
- Added text and icons to statscards [`1c43011`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/1c43011842cfc2bd62abaef45af9fccd3e20b250)
- Prepared for transition to extensin repo [`ba74bc4`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/ba74bc4161476f87d209cb864a91fafa58cc55cf)
- Added docker basics [`44c77a8`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/44c77a8aadb0be115bf465595b27ece74ac63bf2)
- 🚀RELEASE 0.1.0 [`5d4785d`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/5d4785dea560dc05b8db699194762382ee9e389a)
- Added drone builds for latest and tags [`2346275`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/2346275add471a63e5facb32b839f6fbe3bf9abb)
- Raw extension stuff [`0da135f`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/0da135f27134e4fb443daeb0b9b5aa8e6cb87146)
- Added basic login page [`5263d19`](https://git.odit.services/kauft.es/linkylinky-dashboard/commit/5263d1974a25fe2f9a565e8fb61d9a2295acf8c8)

View File

@@ -1,6 +1,6 @@
{
"name": "@odit/linkylinky-dashboard",
"version": "0.1.0",
"version": "0.2.3",
"scripts": {
"dev": "svelte-kit dev",
"build": "svelte-kit build",
@@ -10,7 +10,7 @@
"format": "prettier --ignore-path .gitignore --write --plugin-search-dir=. ."
},
"devDependencies": {
"@sveltejs/kit": "next",
"@sveltejs/kit": "1.0.0-next.147",
"autoprefixer": "^10.3.1",
"cssnano": "^5.0.6",
"eslint": "^7.22.0",

View File

@@ -11,12 +11,21 @@ axios.interceptors.response.use(response => {
});
export default class Apiclient {
/**
* API-Getter for the linkylinky api stats endpoint
* @returns Current linkylinky stats (url count, total visits)
*/
static async getStats() {
return (
await axios.get('https://kauft.es/api/stats')
).data;
}
/**
* API-Getter for the linkylinky api all urls endpoint (needs auth)
* @returns All urls with shortcode, target, full url and visits in an array of objects
*/
static async getUrls() {
return (
await axios.get('https://kauft.es/api?showVisits=true', {
@@ -25,7 +34,13 @@ export default class Apiclient {
).data;
}
/**
* API-Getter for the linkylinky api url details endpoint (needs auth)
* @param {*} shortcode The shortcode of your favourite url
* @returns Url shortcode, target, full url and visit count in an object
*/
static async getUrlDetails(shortcode) {
//TODO: Handle 404
return (
await axios.get(`https://kauft.es/api/${shortcode}`, {
headers: { Authorization: `Bearer ${UserStore.state.token}` }
@@ -33,7 +48,13 @@ export default class Apiclient {
).data;
}
/**
* API-Getter for the linkylinky api url vists endpoint (needs auth)
* @param {*} shortcode The shortcode of your favourite url
* @returns Url visit details as an object for each visits (r/n they only contain timestamps)
*/
static async getUrlVisits(shortcode) {
//TODO: Handle 404
return (
await axios.get(`https://kauft.es/api/${shortcode}/visits`, {
headers: { Authorization: `Bearer ${UserStore.state.token}` }
@@ -41,6 +62,11 @@ export default class Apiclient {
).data;
}
/**
* API-Delet for the linkylinky api url deletion endpoint (needs auth)
* @param {*} shortcode The shortcode of your most hated url
* @returns Just a 204 (no matter if the url got deleted or didn't exist in the first place)
*/
static async deleteUrl(shortcode) {
return (
await axios.delete(`https://kauft.es/api/${shortcode}`, {
@@ -49,6 +75,12 @@ export default class Apiclient {
).status;
}
/**
* Login and receive a JWT for future auth.
* @param {*} username Your username (cleartext)
* @param {*} password Your password (cleartext)
* @returns A user login object containing your jwt
*/
static async login(username, password) {
return (
await axios.post(`https://kauft.es/api/auth/login`, {}, {
@@ -59,10 +91,16 @@ export default class Apiclient {
).data;
}
/**
* Log yourself out -> Invalidates your current (and past) JWTs
* @returns Done!
*/
static async logout() {
return (
await axios.post(`https://kauft.es/api/auth/logout`, {}, {
headers: { Authorization: `Bearer ${UserStore.state.token}` }
headers: { Authorization: `Bearer ${UserStore.state.token}`,
validateStatus: null
}
})
).data;
}

View File

@@ -1,22 +1,10 @@
<script>
import UserStore from '$lib/UserStore';
import { onDestroy, onMount } from 'svelte';
import * as localForage from 'localforage';
import { onDestroy } from 'svelte';
import Apiclient from './Apiclient';
$: logged_in = false;
UserStore.init();
onMount(() => {
localForage.getItem('userdata', (err, value) => {
if (value) {
if (value.token) {
UserStore.login(value);
}
}
});
});
const unsubscribe = UserStore.subscribe((value) => {
logged_in = value.isLoggedIn;
});
@@ -24,7 +12,7 @@
onDestroy(unsubscribe);
async function logout() {
await Apiclient.logout().catch((e)=>{});
await Apiclient.logout().catch((e) => {});
UserStore.logout();
}
</script>
@@ -58,7 +46,7 @@
<nav>
<a
class="flex items-center px-4 py-2 text-gray-700 bg-gray-200 rounded-md dark:bg-gray-700 dark:text-gray-200"
href="/"
href="./"
>
<svg class="w-5 h-5" viewBox="0 0 24 24" fill="none" xmlns="http://www.w3.org/2000/svg">
<path
@@ -78,7 +66,7 @@
{#if logged_in}
<a
class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700"
href="/links"
href="./links"
>
<svg
xmlns="http://www.w3.org/2000/svg"
@@ -145,7 +133,7 @@
{:else}
<a
class="flex items-center px-4 py-2 mt-5 text-gray-600 transition-colors duration-200 transform rounded-md dark:text-gray-400 hover:bg-gray-200 dark:hover:bg-gray-700 dark:hover:text-gray-200 hover:text-gray-700"
href="/login"
href="./login"
>
<svg
xmlns="http://www.w3.org/2000/svg"
@@ -167,13 +155,15 @@
{/if}
</nav>
<div class="flex items-center px-4 -mx-2">
<img
class="object-cover mx-2 rounded-full h-9 w-9"
src="https://images.unsplash.com/photo-1531427186611-ecfd6d936c79?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=634&q=80"
alt="avatar"
/>
<h4 class="mx-2 font-medium text-gray-800 dark:text-gray-200 hover:underline">John Doe</h4>
</div>
{#if logged_in}
<div class="flex items-center px-4 -mx-2">
<img
class="object-cover mx-2 rounded-full h-9 w-9"
src="https://images.unsplash.com/photo-1531427186611-ecfd6d936c79?ixid=MXwxMjA3fDB8MHxwaG90by1wYWdlfHx8fGVufDB8fHw%3D&ixlib=rb-1.2.1&auto=format&fit=crop&w=634&q=80"
alt="avatar"
/>
<h4 class="mx-2 font-medium text-gray-800 dark:text-gray-200 hover:underline">Username here</h4>
</div>
{/if}
</div>
</div>

View File

@@ -1,11 +1,30 @@
<script>
import '../app.postcss';
import Sidebar from '$lib/Sidebar.svelte';
import UserStore from '$lib/UserStore';
import { onMount } from 'svelte';
import * as localForage from 'localforage';
/**
* Master init for all things userstore, b/c async stuff somethimes does weired shit.
* Yes i know this isn't the best way to implement this, but linkylinky dashboard is just a oneshot sideproject r/n.
*/
onMount(() => {
UserStore.init();
localForage.getItem('userdata', (err, value) => {
if (value) {
if (value.token) {
UserStore.login(value);
}
}
});
});
</script>
<div style="min-height: 640px;" class="bg-white dark:bg-gray-800">
<div class="h-screen flex overflow-hidden">
<Sidebar/>
<Sidebar />
<div class="px-4 py-8 flex flex-col w-0 flex-1 overflow-hidden">
<slot />
</div>

View File

@@ -1,8 +1,11 @@
<script>
import { page } from '$app/stores';
import Apiclient from '$lib/Apiclient';
import UserStore from '$lib/UserStore';
import { onDestroy } from 'svelte';
let shortcode = $page.query.get('shortcode');
$: urlDetails = {
shortcode: 'Loading...',
url: 'Loading...',
@@ -10,13 +13,21 @@
visits: 'Loading...'
};
$: urlVisists = [];
let visitQuery;
Apiclient.getUrlDetails(shortcode).then((res) => {
urlDetails = res;
});
let visitQuery = Apiclient.getUrlVisits(shortcode).then((res) => {
urlVisists = res;
// Yes i know this isn't the best way to implement this, but linkylinky dashboard is just a oneshot sideproject r/n.
const unsubscribe = UserStore.subscribe((value) => {
if (value.isLoggedIn) {
Apiclient.getUrlDetails(shortcode).then((res) => {
urlDetails = res;
});
visitQuery = Apiclient.getUrlVisits(shortcode).then((res) => {
urlVisists = res;
});
}
});
onDestroy(unsubscribe);
</script>
<h2 class="text-3xl font-bold text-gray-800 dark:text-gray-100 pb-6">Details: {shortcode}</h2>

View File

@@ -1,10 +1,22 @@
<script>
import Apiclient from '$lib/Apiclient';
import UserStore from '$lib/UserStore';
import { onDestroy } from 'svelte';
$: urls = [];
let urlQuery = Apiclient.getUrls().then((res) => {
urls = res;
let urlQuery;
// Yes i know this isn't the best way to implement this, but linkylinky dashboard is just a oneshot sideproject r/n.
const unsubscribe = UserStore.subscribe((value) => {
if (value.isLoggedIn) {
urlQuery = Apiclient.getUrls().then((res) => {
urls = res;
});
}
});
onDestroy(unsubscribe);
function deleteUrl(shortcode) {
Apiclient.deleteUrl(shortcode).then(() => {
urls = urls.filter((url) => url.shortcode != shortcode);

View File

@@ -7,12 +7,11 @@ import Apiclient from '$lib/Apiclient';
$: password = "";
$: error = "";
UserStore.init();
async function login() {
try {
const login = await Apiclient.login(username, password);
UserStore.login(login);
location.replace("/");
location.replace("./");
} catch (error) {
}
@@ -31,7 +30,7 @@ import Apiclient from '$lib/Apiclient';
<div class="w-full mt-4">
<input
class="block w-full px-4 py-2 mt-2 text-gray-700 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring"
class="block w-full px-4 py-2 mt-2 text-gray-700 dark:text-gray-400 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring"
type="text"
placeholder="Username"
aria-label="Username"
@@ -41,7 +40,7 @@ import Apiclient from '$lib/Apiclient';
<div class="w-full mt-4">
<input
class="block w-full px-4 py-2 mt-2 text-gray-700 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring"
class="block w-full px-4 py-2 mt-2 text-gray-700 dark:text-gray-400 placeholder-gray-500 bg-white border border-gray-300 rounded-md dark:bg-gray-800 dark:border-gray-600 dark:placeholder-gray-400 focus:border-blue-500 dark:focus:border-blue-500 focus:outline-none focus:ring"
type="password"
placeholder="Password"
aria-label="Password"

View File

@@ -9,7 +9,10 @@ const config = {
adapter: staticAdapter(),
files: {
assets: 'static'
}
},
paths: {
base: '/dashboard',
},
},
preprocess: [

View File

@@ -209,10 +209,10 @@
resolved "https://registry.yarnpkg.com/@sveltejs/adapter-static/-/adapter-static-1.0.0-next.16.tgz#656c90666edd730ccc9bfb89e3f7ece56e7ac7c8"
integrity sha512-xGFcg+GHF0BL1fyWx2vCzlYj4S4R+Od9cF00soo1TVp/scGOi1G9grSYYW4x5H+iDn1sscoJ65OGBGWIcOgrXg==
"@sveltejs/kit@next":
version "1.0.0-next.151"
resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-1.0.0-next.151.tgz#6cd086e0f73c40de1ed9625a69af0e2f2773749c"
integrity sha512-dioqHt4XxqiZ+5dEL6hFG1fBuVMc5t9l9bmvUeJX6neyut432IcVLdl4t3utmD10Lu8fbybJPRkHy1PVAbHWwQ==
"@sveltejs/kit@1.0.0-next.147":
version "1.0.0-next.147"
resolved "https://registry.yarnpkg.com/@sveltejs/kit/-/kit-1.0.0-next.147.tgz#1dad06fd7f4365405beebdcd12b410a52c3a03b0"
integrity sha512-rAABsKlC1K/B4VfqT2SaVO29t+OV8deseSJ9l+hV7j9zkswTwiJ7h37tZ5SfnvMgCHemcNjXg8Gzg+0U1MCfEA==
dependencies:
"@sveltejs/vite-plugin-svelte" "^1.0.0-next.16"
cheap-watch "^1.0.3"