A very performant and light (2mb in memory) link shortener and tracker. Written in Rust and React and uses Postgres/SQLite.
1use std::time::{SystemTime, UNIX_EPOCH};
2
3use chrono::NaiveDate;
4use serde::{Deserialize, Serialize};
5use sqlx::FromRow;
6
7#[derive(Debug, Serialize, Deserialize)]
8pub struct Claims {
9 pub sub: i32, // user id
10 pub exp: usize,
11}
12
13impl Claims {
14 pub fn new(user_id: i32) -> Self {
15 let exp = SystemTime::now()
16 .duration_since(UNIX_EPOCH)
17 .unwrap()
18 .as_secs() as usize
19 + 24 * 60 * 60; // 24 hours from now
20
21 Self { sub: user_id, exp }
22 }
23}
24
25#[derive(Deserialize)]
26pub struct CreateLink {
27 pub url: String,
28 pub source: Option<String>,
29 pub custom_code: Option<String>,
30}
31
32#[derive(Serialize, FromRow)]
33pub struct Link {
34 pub id: i32,
35 pub user_id: Option<i32>,
36 pub original_url: String,
37 pub short_code: String,
38 pub created_at: chrono::DateTime<chrono::Utc>,
39 pub clicks: i64,
40}
41
42#[derive(Deserialize)]
43pub struct LoginRequest {
44 pub email: String,
45 pub password: String,
46}
47
48#[derive(Deserialize)]
49pub struct RegisterRequest {
50 pub email: String,
51 pub password: String,
52}
53
54#[derive(Serialize)]
55pub struct AuthResponse {
56 pub token: String,
57 pub user: UserResponse,
58}
59
60#[derive(Serialize)]
61pub struct UserResponse {
62 pub id: i32,
63 pub email: String,
64}
65
66#[derive(FromRow)]
67pub struct User {
68 pub id: i32,
69 pub email: String,
70 pub password_hash: String,
71}
72
73#[derive(sqlx::FromRow, Serialize)]
74pub struct ClickStats {
75 pub date: NaiveDate,
76 pub clicks: i64,
77}
78
79#[derive(sqlx::FromRow, Serialize)]
80pub struct SourceStats {
81 pub source: String,
82 pub count: i64,
83}