mirror of
https://github.com/simon987/task_tracker.git
synced 2025-04-19 18:16:45 +00:00
Clear old monitoring snapshots, logout endpoint
This commit is contained in:
parent
a6802c7109
commit
a90b73ad70
@ -77,6 +77,13 @@ func (api *WebAPI) Login(r *Request) {
|
|||||||
}).Info("Logged in")
|
}).Info("Logged in")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (api *WebAPI) Logout(r *Request) {
|
||||||
|
|
||||||
|
sess := api.Session.StartFasthttp(r.Ctx)
|
||||||
|
sess.Clear()
|
||||||
|
r.Ctx.Response.SetStatusCode(204)
|
||||||
|
}
|
||||||
|
|
||||||
func (api *WebAPI) Register(r *Request) {
|
func (api *WebAPI) Register(r *Request) {
|
||||||
|
|
||||||
req := &RegisterRequest{}
|
req := &RegisterRequest{}
|
||||||
|
@ -102,6 +102,7 @@ func New() *WebAPI {
|
|||||||
|
|
||||||
api.router.POST("/register", LogRequestMiddleware(api.Register))
|
api.router.POST("/register", LogRequestMiddleware(api.Register))
|
||||||
api.router.POST("/login", LogRequestMiddleware(api.Login))
|
api.router.POST("/login", LogRequestMiddleware(api.Login))
|
||||||
|
api.router.GET("/logout", LogRequestMiddleware(api.Logout))
|
||||||
api.router.GET("/account", LogRequestMiddleware(api.AccountDetails))
|
api.router.GET("/account", LogRequestMiddleware(api.AccountDetails))
|
||||||
|
|
||||||
api.router.NotFound = func(ctx *fasthttp.RequestCtx) {
|
api.router.NotFound = func(ctx *fasthttp.RequestCtx) {
|
||||||
|
@ -21,5 +21,5 @@ session:
|
|||||||
expiration: "25m"
|
expiration: "25m"
|
||||||
|
|
||||||
monitoring:
|
monitoring:
|
||||||
snapshot_interval: "10s"
|
snapshot_interval: "60s"
|
||||||
history_length: "3000h"
|
history_length: "4h"
|
||||||
|
@ -2,6 +2,7 @@ package storage
|
|||||||
|
|
||||||
import (
|
import (
|
||||||
"github.com/Sirupsen/logrus"
|
"github.com/Sirupsen/logrus"
|
||||||
|
"github.com/simon987/task_tracker/config"
|
||||||
"time"
|
"time"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -19,7 +20,7 @@ func (database *Database) MakeProjectSnapshots() {
|
|||||||
startTime := time.Now()
|
startTime := time.Now()
|
||||||
db := database.getDB()
|
db := database.getDB()
|
||||||
|
|
||||||
_, err := db.Exec(`
|
insertRes, err := db.Exec(`
|
||||||
INSERT INTO project_monitoring_snapshot
|
INSERT INTO project_monitoring_snapshot
|
||||||
(project, new_task_count, failed_task_count, closed_task_count, worker_access_count,
|
(project, new_task_count, failed_task_count, closed_task_count, worker_access_count,
|
||||||
awaiting_verification_task_count, timestamp)
|
awaiting_verification_task_count, timestamp)
|
||||||
@ -35,9 +36,17 @@ func (database *Database) MakeProjectSnapshots() {
|
|||||||
extract(epoch from now() at time zone 'utc')
|
extract(epoch from now() at time zone 'utc')
|
||||||
FROM project`)
|
FROM project`)
|
||||||
handleErr(err)
|
handleErr(err)
|
||||||
|
inserted, _ := insertRes.RowsAffected()
|
||||||
|
|
||||||
|
res, err := db.Exec(`DELETE FROM project_monitoring_snapshot WHERE timestamp < $1`,
|
||||||
|
int64(time.Now().Unix())-int64(config.Cfg.MonitoringHistory.Seconds()))
|
||||||
|
handleErr(err)
|
||||||
|
deleted, _ := res.RowsAffected()
|
||||||
|
|
||||||
logrus.WithFields(logrus.Fields{
|
logrus.WithFields(logrus.Fields{
|
||||||
"took": time.Now().Sub(startTime),
|
"took": time.Now().Sub(startTime),
|
||||||
|
"add": inserted,
|
||||||
|
"remove": deleted,
|
||||||
}).Trace("Took monitoring snapshot")
|
}).Trace("Took monitoring snapshot")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -0,0 +1,3 @@
|
|||||||
|
mat-divider {
|
||||||
|
margin: 1em 0 !important;
|
||||||
|
}
|
@ -1,5 +1,5 @@
|
|||||||
<div class="container">
|
<div class="container">
|
||||||
<mat-card class="mat-elevation-z8" *ngIf="account">
|
<mat-card class="mat-elevation-z8" *ngIf="authService.account">
|
||||||
|
|
||||||
<mat-card-header>
|
<mat-card-header>
|
||||||
<mat-card-title>{{"account.title" | translate}}</mat-card-title>
|
<mat-card-title>{{"account.title" | translate}}</mat-card-title>
|
||||||
@ -11,19 +11,22 @@
|
|||||||
<mat-list>
|
<mat-list>
|
||||||
<mat-list-item>
|
<mat-list-item>
|
||||||
{{"account.username" | translate}}:
|
{{"account.username" | translate}}:
|
||||||
<pre>{{account.username}}</pre>
|
<pre>{{authService.account.username}}</pre>
|
||||||
</mat-list-item>
|
</mat-list-item>
|
||||||
</mat-list>
|
</mat-list>
|
||||||
|
|
||||||
<mat-expansion-panel>
|
<mat-expansion-panel>
|
||||||
<mat-expansion-panel-header>{{"account.metadata" | translate}}</mat-expansion-panel-header>
|
<mat-expansion-panel-header>{{"account.metadata" | translate}}</mat-expansion-panel-header>
|
||||||
<pre> {{account | json}}</pre>
|
<pre> {{authService.account | json}}</pre>
|
||||||
</mat-expansion-panel>
|
</mat-expansion-panel>
|
||||||
|
|
||||||
|
<mat-divider class="divider" [inset]="true"></mat-divider>
|
||||||
|
|
||||||
</mat-card-content>
|
</mat-card-content>
|
||||||
|
|
||||||
<mat-card-actions>
|
<mat-card-actions>
|
||||||
|
<button mat-raised-button color="primary" (click)="logout()">{{"account.logout" | translate}}</button>
|
||||||
|
|
||||||
</mat-card-actions>
|
</mat-card-actions>
|
||||||
</mat-card>
|
</mat-card>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
@ -8,13 +8,13 @@ import {AuthService} from "../auth.service";
|
|||||||
})
|
})
|
||||||
export class AccountDetailsComponent implements OnInit {
|
export class AccountDetailsComponent implements OnInit {
|
||||||
|
|
||||||
account: Manager;
|
constructor(public authService: AuthService) {
|
||||||
|
|
||||||
constructor(private authService: AuthService) {
|
|
||||||
}
|
}
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.account = this.authService.account;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public logout() {
|
||||||
|
this.authService.logout();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -45,6 +45,10 @@ export class ApiService {
|
|||||||
return this.http.post(this.url + "/login", credentials, this.options)
|
return this.http.post(this.url + "/login", credentials, this.options)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
logout() {
|
||||||
|
return this.http.get(this.url + "/logout", this.options)
|
||||||
|
}
|
||||||
|
|
||||||
getAccountDetails() {
|
getAccountDetails() {
|
||||||
return this.http.get(this.url + "/account", this.options)
|
return this.http.get(this.url + "/account", this.options)
|
||||||
}
|
}
|
||||||
|
@ -29,8 +29,12 @@
|
|||||||
</mat-menu>
|
</mat-menu>
|
||||||
</div>
|
</div>
|
||||||
<span class="nav-spacer"></span>
|
<span class="nav-spacer"></span>
|
||||||
<button mat-button [class.mat-accent]="router.url == '/login'" class="nav-link"
|
<button mat-button [class.mat-accent]="router.url == '/login'"
|
||||||
|
class="nav-link" *ngIf="!authService.account"
|
||||||
[routerLink]="'login'">{{"nav.login" | translate}}</button>
|
[routerLink]="'login'">{{"nav.login" | translate}}</button>
|
||||||
|
<button mat-button [class.mat-accent]="router.url == '/account'"
|
||||||
|
class="nav-link" *ngIf="authService.account"
|
||||||
|
[routerLink]="'account'">{{"nav.account" | translate}}</button>
|
||||||
|
|
||||||
<button mat-button [matMenuTriggerFor]="langMenu">
|
<button mat-button [matMenuTriggerFor]="langMenu">
|
||||||
{{"nav.lang_select" | translate}}
|
{{"nav.lang_select" | translate}}
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
import {Component} from '@angular/core';
|
import {Component} from '@angular/core';
|
||||||
import {Router} from '@angular/router';
|
import {Router} from '@angular/router';
|
||||||
import {TranslateService} from "@ngx-translate/core";
|
import {TranslateService} from "@ngx-translate/core";
|
||||||
|
import {AuthService} from "./auth.service";
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-root',
|
selector: 'app-root',
|
||||||
@ -18,7 +19,9 @@ export class AppComponent {
|
|||||||
{lang: "en", display: "English"},
|
{lang: "en", display: "English"},
|
||||||
];
|
];
|
||||||
|
|
||||||
constructor(private translate: TranslateService, private router: Router) {
|
constructor(private translate: TranslateService,
|
||||||
|
private router: Router,
|
||||||
|
public authService: AuthService) {
|
||||||
|
|
||||||
translate.addLangs([
|
translate.addLangs([
|
||||||
"en",
|
"en",
|
||||||
|
@ -14,6 +14,10 @@ export class AuthService {
|
|||||||
constructor(private apiService: ApiService,
|
constructor(private apiService: ApiService,
|
||||||
private messengerService: MessengerService,
|
private messengerService: MessengerService,
|
||||||
private router: Router) {
|
private router: Router) {
|
||||||
|
this.apiService.getAccountDetails()
|
||||||
|
.subscribe((data: any) => {
|
||||||
|
this.account = data.manager;
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
public login(credentials: Credentials) {
|
public login(credentials: Credentials) {
|
||||||
@ -33,6 +37,20 @@ export class AuthService {
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public logout() {
|
||||||
|
return this.apiService.logout()
|
||||||
|
.subscribe(
|
||||||
|
() => {
|
||||||
|
this.account = null;
|
||||||
|
this.router.navigateByUrl("");
|
||||||
|
},
|
||||||
|
error => {
|
||||||
|
console.log(error);
|
||||||
|
this.messengerService.show(error.error.message);
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
public register(credentials: Credentials) {
|
public register(credentials: Credentials) {
|
||||||
return this.apiService.register(credentials)
|
return this.apiService.register(credentials)
|
||||||
.subscribe(() =>
|
.subscribe(() =>
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
"project_list": "Projects",
|
"project_list": "Projects",
|
||||||
"new_project": "New Project",
|
"new_project": "New Project",
|
||||||
"login": "Login",
|
"login": "Login",
|
||||||
"worker_dashboard": "Workers"
|
"worker_dashboard": "Workers",
|
||||||
|
"account": "Account"
|
||||||
},
|
},
|
||||||
"logs": {
|
"logs": {
|
||||||
"filter": "Filter",
|
"filter": "Filter",
|
||||||
@ -79,7 +80,8 @@
|
|||||||
"metadata": "Account metadata",
|
"metadata": "Account metadata",
|
||||||
"title": "Account details",
|
"title": "Account details",
|
||||||
"subtitle": "toto: subtitle",
|
"subtitle": "toto: subtitle",
|
||||||
"username": "Username"
|
"username": "Username",
|
||||||
|
"logout": "Logout"
|
||||||
},
|
},
|
||||||
"workers": {
|
"workers": {
|
||||||
"title": "Completed tasks per worker",
|
"title": "Completed tasks per worker",
|
||||||
|
@ -6,7 +6,8 @@
|
|||||||
"project_list": "Projets",
|
"project_list": "Projets",
|
||||||
"new_project": "Nouveau projet",
|
"new_project": "Nouveau projet",
|
||||||
"login": "Ouvrir un session",
|
"login": "Ouvrir un session",
|
||||||
"worker_dashboard": "Workers"
|
"worker_dashboard": "Workers",
|
||||||
|
"account": "Compte"
|
||||||
},
|
},
|
||||||
"logs": {
|
"logs": {
|
||||||
"filter": "Filtrer",
|
"filter": "Filtrer",
|
||||||
@ -81,7 +82,8 @@
|
|||||||
"metadata": "Métadonnés du compte",
|
"metadata": "Métadonnés du compte",
|
||||||
"title": "Détails du compte",
|
"title": "Détails du compte",
|
||||||
"subtitle": "toto: sous-titre",
|
"subtitle": "toto: sous-titre",
|
||||||
"username": "Nom d'utilisateur"
|
"username": "Nom d'utilisateur",
|
||||||
|
"logout": "Fermer la session"
|
||||||
},
|
},
|
||||||
"workers": {
|
"workers": {
|
||||||
"title": "Tâches complétés par worker",
|
"title": "Tâches complétés par worker",
|
||||||
|
Loading…
x
Reference in New Issue
Block a user