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}