1
0
Fork 0
forked from TWS/kalkutago

Compare commits

..

16 commits

6 changed files with 58 additions and 22 deletions

View file

@ -1,5 +1,14 @@
<script setup lang="ts"> <script setup lang="ts">
import { RouterLink } from 'vue-router'; import { RouterLink } from 'vue-router';
import { error } from '../error'
import router from "../router";
async function logOut() {
const result = await fetch('/api/v1/auth', {method: 'DELETE'})
if(!result.ok) return error('failed to log out')
console.debug('logged out')
router.push('/login')
}
</script> </script>
<template> <template>
<nav class="navbar" role="navigation" aria-label="main navigation"> <nav class="navbar" role="navigation" aria-label="main navigation">
@ -9,20 +18,27 @@ import { RouterLink } from 'vue-router';
<div class="navbar-menu"></div> <div class="navbar-menu"></div>
<div class="navbar-end"> <div class="navbar-end">
<div class="navbar-item"> <div class="navbar-item">
<div class="buttons"> <RouterLink to="/" v-if="$route.path === '/new-track'">
<RouterLink to="/" v-if="$route.path === '/new-track'"> <button class="button is-info">
<button class="button is-info"> Go Back
Go Back </button>
</button> </RouterLink>
</RouterLink>
<RouterLink to="/new-track" v-else> <RouterLink to="/new-track" v-else>
<button class="button is-primary"> <button class="button is-primary">
Add Track Add Track
</button> </button>
</RouterLink> </RouterLink>
</div> </div>
<div class="navbar-item">
<button class="button is-info" @click="logOut">
Log Out
</button>
</div>
<div class="navbar-item">
<!-- spacer -->
&nbsp;
</div> </div>
</div> </div>
</nav> </nav>
</template> </template>

View file

@ -2,6 +2,7 @@ import { reactive } from "vue"
import { Track } from "./track" import { Track } from "./track"
import { Tick } from './ticks' import { Tick } from './ticks'
import { error } from "./error" import { error } from "./error"
import { getCookie } from "./util";
enum State { enum State {
Unfetched, Unfetched,
@ -31,6 +32,8 @@ class AppState {
constructor() { constructor() {
this.tracks = new Array<Track> this.tracks = new Array<Track>
this.state = State.Unfetched this.state = State.Unfetched
const name = getCookie("name")
if (name) this.user = { name }
} }
streamUpdatesFromServer() { streamUpdatesFromServer() {
const source = new EventSource("/api/v1/updates") const source = new EventSource("/api/v1/updates")

8
client/src/util.ts Normal file
View file

@ -0,0 +1,8 @@
export function getCookie(key: string): string | null {
const start = document.cookie.indexOf(key + '=')
if(start === -1) return null
let end: number | undefined = document.cookie.indexOf(';', start)
if(end === -1)
end = undefined
return document.cookie.substring(start + key.length + 1, end)
}

View file

@ -69,6 +69,12 @@ pub(super) async fn sign_up(
Ok(()) Ok(())
} }
#[delete("/")]
pub(super) async fn sign_out(cookies: &CookieJar<'_>) {
cookies.remove_private(Cookie::named("user"));
cookies.remove(Cookie::named("name"));
}
/// Authentication guard /// Authentication guard
#[derive(Deref)] #[derive(Deref)]
pub(super) struct Auth(users::Model); pub(super) struct Auth(users::Model);

View file

@ -114,7 +114,7 @@ pub fn start_server(db: DatabaseConnection) -> Rocket<Build> {
"/api/v1/groups", "/api/v1/groups",
routes![all_groups, group, insert_group, update_group, delete_group], routes![all_groups, group, insert_group, update_group, delete_group],
) )
.mount("/api/v1/auth", routes![auth::login, auth::sign_up]) .mount("/api/v1/auth", routes![auth::login, auth::sign_up, auth::sign_out])
.mount("/", FileServer::from("/src/public")); .mount("/", FileServer::from("/src/public"));
#[cfg(feature = "unsafe_import")] #[cfg(feature = "unsafe_import")]

View file

@ -2,13 +2,16 @@
{ pkgs ? import <nixpkgs> {} }: { pkgs ? import <nixpkgs> {} }:
pkgs.mkShell { pkgs.mkShell {
nativeBuildInputs = with pkgs.buildPackages; [ name = "kalkutago";
clang nativeBuildInputs = with pkgs.buildPackages; [
yarn nodejs clang
openssl yarn nodejs
python3 openssl
python3Packages.requests python3
python3Packages.ipython python3Packages.requests
python3Packages.ipython
rustup
docker
gnumake
]; ];
} }