summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--.sqlx/query-02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e.json15
-rw-r--r--.sqlx/query-225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e.json28
-rw-r--r--.sqlx/query-9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf.json75
-rw-r--r--.sqlx/query-c84004689d98d72b2f6d0d3bf67ec59e81334fd4e49e62ddd56bde4f30c1200d.json (renamed from .sqlx/query-7609165d94c8f1bea9d535b9b7ad727fd06592973d7f83017292d41acb203be6.json)10
-rw-r--r--.sqlx/query-c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327.json22
-rw-r--r--.sqlx/query-f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a.json32
-rw-r--r--Cargo.lock15
-rw-r--r--Cargo.toml3
-rw-r--r--migrations/20231003193749_pinussy.sql43
-rw-r--r--src/db/users.rs21
-rw-r--r--src/routes/home.rs3
-rw-r--r--src/routes/login.rs3
-rw-r--r--src/users.rs4
13 files changed, 165 insertions, 109 deletions
diff --git a/.sqlx/query-02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e.json b/.sqlx/query-02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e.json
deleted file mode 100644
index 3875b63..0000000
--- a/.sqlx/query-02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e.json
+++ /dev/null
@@ -1,15 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "insert into users(username, password) values ($1, $2)",
- "describe": {
- "columns": [],
- "parameters": {
- "Left": [
- "Varchar",
- "Varchar"
- ]
- },
- "nullable": []
- },
- "hash": "02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e"
-}
diff --git a/.sqlx/query-225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e.json b/.sqlx/query-225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e.json
deleted file mode 100644
index 5cb27e4..0000000
--- a/.sqlx/query-225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e.json
+++ /dev/null
@@ -1,28 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "select id, password from users where username = $1",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "id",
- "type_info": "Int4"
- },
- {
- "ordinal": 1,
- "name": "password",
- "type_info": "Varchar"
- }
- ],
- "parameters": {
- "Left": [
- "Text"
- ]
- },
- "nullable": [
- false,
- false
- ]
- },
- "hash": "225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e"
-}
diff --git a/.sqlx/query-9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf.json b/.sqlx/query-9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf.json
new file mode 100644
index 0000000..535c9c3
--- /dev/null
+++ b/.sqlx/query-9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf.json
@@ -0,0 +1,75 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "select id, username, password, email, bio, site, privacy as \"privacy: _\", admin from users where username = $1",
+ "describe": {
+ "columns": [
+ {
+ "ordinal": 0,
+ "name": "id",
+ "type_info": "Uuid"
+ },
+ {
+ "ordinal": 1,
+ "name": "username",
+ "type_info": "Varchar"
+ },
+ {
+ "ordinal": 2,
+ "name": "password",
+ "type_info": "Varchar"
+ },
+ {
+ "ordinal": 3,
+ "name": "email",
+ "type_info": "Varchar"
+ },
+ {
+ "ordinal": 4,
+ "name": "bio",
+ "type_info": "Text"
+ },
+ {
+ "ordinal": 5,
+ "name": "site",
+ "type_info": "Varchar"
+ },
+ {
+ "ordinal": 6,
+ "name": "privacy: _",
+ "type_info": {
+ "Custom": {
+ "name": "privacy",
+ "kind": {
+ "Enum": [
+ "private",
+ "unlisted",
+ "public"
+ ]
+ }
+ }
+ }
+ },
+ {
+ "ordinal": 7,
+ "name": "admin",
+ "type_info": "Bool"
+ }
+ ],
+ "parameters": {
+ "Left": [
+ "Text"
+ ]
+ },
+ "nullable": [
+ false,
+ false,
+ false,
+ true,
+ true,
+ true,
+ false,
+ false
+ ]
+ },
+ "hash": "9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf"
+}
diff --git a/.sqlx/query-7609165d94c8f1bea9d535b9b7ad727fd06592973d7f83017292d41acb203be6.json b/.sqlx/query-c84004689d98d72b2f6d0d3bf67ec59e81334fd4e49e62ddd56bde4f30c1200d.json
index 85dc959..bf7c9ad 100644
--- a/.sqlx/query-7609165d94c8f1bea9d535b9b7ad727fd06592973d7f83017292d41acb203be6.json
+++ b/.sqlx/query-c84004689d98d72b2f6d0d3bf67ec59e81334fd4e49e62ddd56bde4f30c1200d.json
@@ -1,12 +1,12 @@
{
"db_name": "PostgreSQL",
- "query": "select * from users where id = $1",
+ "query": "select id, username, password, email, bio, site, privacy as \"privacy: _\", admin from users where id = $1",
"describe": {
"columns": [
{
"ordinal": 0,
"name": "id",
- "type_info": "Int4"
+ "type_info": "Uuid"
},
{
"ordinal": 1,
@@ -35,7 +35,7 @@
},
{
"ordinal": 6,
- "name": "privacy",
+ "name": "privacy: _",
"type_info": {
"Custom": {
"name": "privacy",
@@ -57,7 +57,7 @@
],
"parameters": {
"Left": [
- "Int4"
+ "Uuid"
]
},
"nullable": [
@@ -71,5 +71,5 @@
false
]
},
- "hash": "7609165d94c8f1bea9d535b9b7ad727fd06592973d7f83017292d41acb203be6"
+ "hash": "c84004689d98d72b2f6d0d3bf67ec59e81334fd4e49e62ddd56bde4f30c1200d"
}
diff --git a/.sqlx/query-c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327.json b/.sqlx/query-c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327.json
deleted file mode 100644
index 32952b5..0000000
--- a/.sqlx/query-c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327.json
+++ /dev/null
@@ -1,22 +0,0 @@
-{
- "db_name": "PostgreSQL",
- "query": "select username from users where id = $1",
- "describe": {
- "columns": [
- {
- "ordinal": 0,
- "name": "username",
- "type_info": "Varchar"
- }
- ],
- "parameters": {
- "Left": [
- "Int4"
- ]
- },
- "nullable": [
- false
- ]
- },
- "hash": "c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327"
-}
diff --git a/.sqlx/query-f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a.json b/.sqlx/query-f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a.json
new file mode 100644
index 0000000..849a6cc
--- /dev/null
+++ b/.sqlx/query-f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a.json
@@ -0,0 +1,32 @@
+{
+ "db_name": "PostgreSQL",
+ "query": "insert into users (id, username, password, email, bio, site, privacy, admin) values ($1, $2, $3, $4, $5, $6, $7, $8)",
+ "describe": {
+ "columns": [],
+ "parameters": {
+ "Left": [
+ "Uuid",
+ "Varchar",
+ "Varchar",
+ "Varchar",
+ "Text",
+ "Varchar",
+ {
+ "Custom": {
+ "name": "privacy",
+ "kind": {
+ "Enum": [
+ "private",
+ "unlisted",
+ "public"
+ ]
+ }
+ }
+ },
+ "Bool"
+ ]
+ },
+ "nullable": []
+ },
+ "hash": "f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a"
+}
diff --git a/Cargo.lock b/Cargo.lock
index 58f278c..cc7b8b7 100644
--- a/Cargo.lock
+++ b/Cargo.lock
@@ -1724,6 +1724,7 @@ dependencies = [
"serde",
"sqlx",
"tracing",
+ "uuid",
"web-archive",
]
@@ -2333,6 +2334,7 @@ dependencies = [
"tokio-stream",
"tracing",
"url",
+ "uuid",
]
[[package]]
@@ -2413,6 +2415,7 @@ dependencies = [
"stringprep",
"thiserror",
"tracing",
+ "uuid",
"whoami",
]
@@ -2452,6 +2455,7 @@ dependencies = [
"stringprep",
"thiserror",
"tracing",
+ "uuid",
"whoami",
]
@@ -2475,6 +2479,7 @@ dependencies = [
"sqlx-core",
"tracing",
"url",
+ "uuid",
]
[[package]]
@@ -2827,6 +2832,16 @@ source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "09cc8ee72d2a9becf2f2febe0205bbed8fc6615b7cb429ad062dc7b7ddd036a9"
[[package]]
+name = "uuid"
+version = "1.6.1"
+source = "registry+https://github.com/rust-lang/crates.io-index"
+checksum = "5e395fcf16a7a3d8127ec99782007af141946b4795001f876d54fb0d55978560"
+dependencies = [
+ "getrandom 0.2.10",
+ "serde",
+]
+
+[[package]]
name = "vcpkg"
version = "0.2.15"
source = "registry+https://github.com/rust-lang/crates.io-index"
diff --git a/Cargo.toml b/Cargo.toml
index 708133b..ec8e8a5 100644
--- a/Cargo.toml
+++ b/Cargo.toml
@@ -15,6 +15,7 @@ actix-web = "4.4.0"
bcrypt = "0.15.0"
mime = "0.3.17"
serde = "1.0.188"
-sqlx = { version = "0.7.2", features = ["postgres", "runtime-tokio"] }
+sqlx = { version = "0.7.2", features = ["uuid", "postgres", "runtime-tokio"] }
tracing = "0.1.37"
+uuid = { version = "1.6.1", features = ["v4", "serde"] }
web-archive = "0.2.0"
diff --git a/migrations/20231003193749_pinussy.sql b/migrations/20231003193749_pinussy.sql
index cba545e..4ac7474 100644
--- a/migrations/20231003193749_pinussy.sql
+++ b/migrations/20231003193749_pinussy.sql
@@ -1,8 +1,9 @@
create type privacy as enum ('private', 'unlisted', 'public');
create type file_type as enum ('image', 'video', 'audio', 'text', 'document', 'site', 'other');
+create extension if not exists "uuid-ossp";
create table users (
- id integer primary key generated always as identity,
+ id uuid primary key default gen_random_uuid(),
username varchar(32) not null,
unique(username),
password varchar(128) not null,
@@ -13,15 +14,15 @@ create table users (
admin boolean not null default true
);
-create table sessions (
- id varchar(128) primary key,
- expires timestamp with time zone,
- user_id integer not null,
- foreign key (user_id) references users(id)
-);
+-- create table sessions (
+-- id varchar(128) primary key,
+-- expires timestamp with time zone,
+-- user_id integer not null,
+-- foreign key (user_id) references users(id)
+-- );
create table boards (
- id integer primary key generated always as identity,
+ id uuid primary key default gen_random_uuid(),
idname varchar(256),
name varchar(256),
description text,
@@ -29,15 +30,15 @@ create table boards (
);
create table board_ownership (
- board_id integer not null,
- user_id integer not null,
+ board_id uuid not null,
+ user_id uuid not null,
foreign key (board_id) references boards(id),
foreign key (user_id) references users(id),
primary key (board_id, user_id)
);
create table pins (
- id integer primary key generated always as identity,
+ id uuid primary key default gen_random_uuid(),
idname varchar(256),
subject varchar(256),
notes text,
@@ -45,23 +46,23 @@ create table pins (
);
create table pin_ownership (
- pin_id integer not null,
- user_id integer not null,
+ pin_id uuid not null,
+ user_id uuid not null,
foreign key (pin_id) references pins(id),
foreign key (user_id) references users(id),
primary key (pin_id, user_id)
);
create table pins_boards (
- pin_id integer not null,
- board_id integer not null,
+ pin_id uuid not null,
+ board_id uuid not null,
foreign key (pin_id) references pins(id),
foreign key (board_id) references boards(id),
primary key (pin_id, board_id)
);
create table sources (
- id integer primary key generated always as identity,
+ id uuid primary key default gen_random_uuid(),
idname varchar(256),
title varchar(256),
author varchar(256),
@@ -72,22 +73,22 @@ create table sources (
);
create table pin_sources (
- source_id integer not null,
- pin_id integer not null,
+ source_id uuid not null,
+ pin_id uuid not null,
foreign key (source_id) references sources(id),
foreign key (pin_id) references pins(id),
primary key (source_id, pin_id)
);
create table files (
- id integer primary key generated always as identity,
+ id uuid primary key default gen_random_uuid(),
idname varchar(256),
thumbnail varchar(256),
path varchar(256) not null,
title varchar(256),
type file_type,
alt_text text,
- pin_id integer not null,
+ pin_id uuid not null,
foreign key (pin_id) references pins(id)
);
@@ -97,7 +98,7 @@ create table tags (
create table tags_pins (
tag varchar(128) not null,
- pin_id integer not null,
+ pin_id uuid not null,
foreign key (tag) references tags(tag),
foreign key (pin_id) references pins(id),
primary key (tag, pin_id)
diff --git a/src/db/users.rs b/src/db/users.rs
index 0fc7c64..a5759fd 100644
--- a/src/db/users.rs
+++ b/src/db/users.rs
@@ -1,11 +1,12 @@
use sqlx::{Pool, Postgres};
+use uuid::Uuid;
use crate::users::User;
use crate::Result;
#[derive(Clone)]
pub struct Users(Pool<Postgres>);
-// code code code code code code code code code code code code code code
+
impl Users {
pub fn new(pool: Pool<Postgres>) -> Self {
Self(pool)
@@ -13,7 +14,8 @@ impl Users {
pub async fn create(&self, user: User) -> Result<()> {
sqlx::query!(
- r#"insert into users (username, password, email, bio, site, privacy, admin) values ($1, $2, $3, $4, $5, $6, $7)"#,
+ r#"insert into users (id, username, password, email, bio, site, privacy, admin) values ($1, $2, $3, $4, $5, $6, $7, $8)"#,
+ user.id,
user.username,
user.password,
user.email,
@@ -27,11 +29,11 @@ impl Users {
Ok(())
}
- pub async fn read(&self, user_id: i32) -> Result<User> {
+ pub async fn read(&self, user_id: Uuid) -> Result<User> {
Ok(
sqlx::query_as!(
User,
- "select username, password, email, bio, site, privacy as \"privacy: _\", admin from users where id = $1",
+ "select id, username, password, email, bio, site, privacy as \"privacy: _\", admin from users where id = $1",
user_id
)
.fetch_one(&self.0)
@@ -43,7 +45,7 @@ impl Users {
Ok(
sqlx::query_as!(
User,
- "select username, password, email, bio, site, privacy as \"privacy: _\", admin from users where username = $1",
+ "select id, username, password, email, bio, site, privacy as \"privacy: _\", admin from users where username = $1",
username
)
.fetch_one(&self.0)
@@ -51,15 +53,6 @@ impl Users {
)
}
- pub async fn get_id(&self, username: &str) -> Result<i32> {
- Ok(
- sqlx::query!("select id from users where username = $1", username)
- .fetch_one(&self.0)
- .await?
- .id,
- )
- }
-
pub async fn read_all(&self) -> Result<Vec<User>> {
Ok(sqlx::query_as("select * from users")
.fetch_all(&self.0)
diff --git a/src/routes/home.rs b/src/routes/home.rs
index a43eabc..f2642a5 100644
--- a/src/routes/home.rs
+++ b/src/routes/home.rs
@@ -1,5 +1,6 @@
use actix_session::Session;
use actix_web::{get, web, HttpResponse};
+use uuid::Uuid;
use crate::templates;
use crate::{Pinussy, Result};
@@ -7,7 +8,7 @@ use crate::{Pinussy, Result};
#[get("/")]
async fn get(session: Session, state: web::Data<Pinussy>) -> Result<HttpResponse> {
let username: Option<String>;
- if let Some(user_id) = session.get::<i32>("user_id")? {
+ if let Some(user_id) = session.get::<Uuid>("user_id")? {
username = Some(state.db.users().read(user_id).await?.username)
} else {
username = None
diff --git a/src/routes/login.rs b/src/routes/login.rs
index c6cf077..bd7eaf1 100644
--- a/src/routes/login.rs
+++ b/src/routes/login.rs
@@ -30,8 +30,7 @@ async fn post(
match state.db.users().read_username(&form.username).await {
Ok(user) => {
if user.verify_password(&form.password)? {
- let user_id = state.db.users().get_id(&form.username).await?;
- session.insert("user_id", user_id)?;
+ session.insert("user_id", user.id)?;
return Ok(HttpResponse::SeeOther()
.insert_header((LOCATION, "/"))
.finish());
diff --git a/src/users.rs b/src/users.rs
index 4cf9310..e8b0b67 100644
--- a/src/users.rs
+++ b/src/users.rs
@@ -1,12 +1,14 @@
use bcrypt::hash;
use bcrypt::verify;
use bcrypt::DEFAULT_COST;
+use uuid::Uuid;
use crate::Privacy;
use crate::Result;
#[derive(sqlx::FromRow)]
pub struct User {
+ pub id: Uuid,
pub username: String,
pub password: String,
pub email: Option<String>,
@@ -19,7 +21,9 @@ pub struct User {
impl User {
pub fn new(username: String, password: String) -> Result<Self> {
let password_hash = hash(password, DEFAULT_COST)?;
+ let id = Uuid::new_v4();
Ok(Self {
+ id,
username,
password: password_hash,
email: None,