diesel_database_design/entity/user.rs
1//! `user` table's entity.
2
3use chrono::{DateTime, Utc};
4use diesel::prelude::*;
5use uuid::Uuid;
6use serde::{Deserialize, Serialize};
7use sqlx::FromRow;
8
9/// ## テーブル情報
10///
11/// | 項目 | 内容 |
12/// |--------------|-------------------------------------------|
13/// | 論理名 | ユーザーテーブル |
14/// | 物理名 | `users` |
15/// | 説明 | サービスを利用するユーザー情報を格納する。|
16#[derive(Queryable, Selectable, Debug, Clone, PartialEq, Eq, Serialize, Deserialize, FromRow)]
17#[diesel(table_name = crate::schema::users)]
18#[diesel(check_for_backend(diesel::pg::Pg))]
19pub struct User {
20 /// ### カラム情報
21 ///
22 /// | 項目 | 内容 |
23 /// |--------------|-------------------------------------|
24 /// | 論理名 | ユーザーID |
25 /// | 物理名 | `id` |
26 /// | データ型 | `UUID` |
27 /// | 説明 | ユーザーを一位に識別するID。 |
28 /// | 制約 | `PRIMARY KEY`, `DEFAULT uuid_generate_v7()` |
29 pub id: Uuid,
30
31 /// ### カラム情報
32 ///
33 /// | 項目 | 内容 |
34 /// |--------------|-------------------------------------|
35 /// | 論理名 | ユーザー名 |
36 /// | 物理名 | `name` |
37 /// | データ型 | `VARCHAR` |
38 /// | 説明 | ユーザーが表示する名前。 |
39 /// | 制約 | `NOT NULL`, `UNIQUE` |
40 pub name: String,
41
42 /// ### カラム情報
43 ///
44 /// | 項目 | 内容 |
45 /// |--------------|-------------------------------------|
46 /// | 論理名 | メールアドレス |
47 /// | 物理名 | `email` |
48 /// | データ型 | `VARCHAR` |
49 /// | 説明 | ログインや通知に使用する。 |
50 /// | 制約 | `NOT NULL`, `UNIQUE` |
51 pub email: String,
52
53 /// ### カラム情報
54 ///
55 /// | 項目 | 内容 |
56 /// |--------------|-------------------------------------|
57 /// | 論理名 | パスワードハッシュ |
58 /// | 物理名 | `password_hash` |
59 /// | データ型 | `VARCHAR` |
60 /// | 説明 | ハッシュ化されたパスワード。 |
61 /// | 制約 | `NOT NULL` |
62 pub password_hash: String,
63
64 /// ### カラム情報
65 ///
66 /// | 項目 | 内容 |
67 /// |--------------|-------------------------------------|
68 /// | 論理名 | 作成日時 |
69 /// | 物理名 | `created_at` |
70 /// | データ型 | `TIMESTAMP WITH TIME ZONE` |
71 /// | 説明 | レコードが作成された日時。 |
72 /// | 制約 | `NOT NULL`, `DEFAULT NOW()` |
73 pub created_at: DateTime<Utc>,
74
75 /// ### カラム情報
76 ///
77 /// | 項目 | 内容 |
78 /// |--------------|-------------------------------------|
79 /// | 論理名 | 更新日時 |
80 /// | 物理名 | `updated_at` |
81 /// | データ型 | `TIMESTAMP WITH TIME ZONE` |
82 /// | 説明 | レコードが最後に更新された日時。 |
83 /// | 制約 | `NOT NULL`, `DEFAULT NOW()` |
84 pub updated_at: DateTime<Utc>,
85}
86
87/// ユーザー作成用の構造体
88#[derive(Insertable, Debug)]
89#[diesel(table_name = crate::schema::users)]
90pub struct NewUser<'a> {
91 pub name: &'a str,
92 pub email: &'a str,
93 pub password_hash: &'a str,
94}