diff options
| author | 2023-12-13 06:50:44 +0000 | |
|---|---|---|
| committer | 2023-12-13 06:50:44 +0000 | |
| commit | a971d8c2dc519b1db805c72cf3395c188a98dff4 (patch) | |
| tree | 98e7db2d690b778b605cf8027cd14ad1eae1f053 | |
| parent | a587459a1817c0fc57b46df3f9c69567e1e775b7 (diff) | |
| download | pinussy-a971d8c2dc519b1db805c72cf3395c188a98dff4.tar.gz pinussy-a971d8c2dc519b1db805c72cf3395c188a98dff4.tar.bz2 pinussy-a971d8c2dc519b1db805c72cf3395c188a98dff4.zip | |
switch to uuids
Diffstat (limited to '')
| -rw-r--r-- | .sqlx/query-02f9efc3c66ab999a3ed07f6637086f5cac7b06f1ad459eb688b85200495045e.json | 15 | ||||
| -rw-r--r-- | .sqlx/query-225521d5c1c07dd1be7873b7589f3d9a9789b2a3b099d98753a2997bc046e99e.json | 28 | ||||
| -rw-r--r-- | .sqlx/query-9febe1398aa650b2d39688ebfc2c7af9ebadaf12e2a7069ee6f2cd5c07a8e0bf.json | 75 | ||||
| -rw-r--r-- | .sqlx/query-c84004689d98d72b2f6d0d3bf67ec59e81334fd4e49e62ddd56bde4f30c1200d.json (renamed from .sqlx/query-7609165d94c8f1bea9d535b9b7ad727fd06592973d7f83017292d41acb203be6.json) | 10 | ||||
| -rw-r--r-- | .sqlx/query-c9482dda19cb67fab64db269b2a993a7b12da41c392fbf8f66c29a1c08531327.json | 22 | ||||
| -rw-r--r-- | .sqlx/query-f5dd8c96f94c54363097d61fde7344425f491da5e9ca9f7d6df9726fd457582a.json | 32 | ||||
| -rw-r--r-- | Cargo.lock | 15 | ||||
| -rw-r--r-- | Cargo.toml | 3 | ||||
| -rw-r--r-- | migrations/20231003193749_pinussy.sql | 43 | ||||
| -rw-r--r-- | src/db/users.rs | 21 | ||||
| -rw-r--r-- | src/routes/home.rs | 3 | ||||
| -rw-r--r-- | src/routes/login.rs | 3 | ||||
| -rw-r--r-- | src/users.rs | 4 | 
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" +} @@ -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" @@ -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, | 
