## OverView ### API List |API Name|功能|具權限者| |---|---|---| |**[Post]** LogIn|使用者登入|Admin/User| |**[Get]** SingleUserDataQuery|查詢單一使用者資料|Admin/User| |**[Update]** SingleUserDateUpdate|更新單一使用者資料|Admin/User| |**[Post**] UserCreate|建立使用者|Admin| |**[Get]** AllUserDataQuery|查詢所有使用者資料|Admin| |**[Update]** MultipleUserDateUpdate|更新複數使用者資料|Admin| |**[Delete]** UserDelete|刪除使用者|Admin| |**[Post]** ResetPWD|重置密碼|Admin/User| ### Structure 使用者透過[Post]LogIn取得token ```mermaid flowchart LoginRequest((使用者登入))-->Login[[Login]]-->Token[/Token/] ``` 使用者發出request,先後依序經過tokenAttribute、AuthorizationAttribute驗證。 ```mermaid flowchart TD Request[/Request/]-->TokenFilter-->AuthorizationFilter --> APIs --> Return subgraph APIs SingleUserDataQuery SingleUserDateUpdate UserCreate AllUserDataQuery MultipleUserDateUpdate UserDelete end TokenFilter[TokenAttribute] AuthorizationFilter[AuthorizaitonAttribute] SingleUserDataQuery[[查詢單一使用者資料]] SingleUserDateUpdate[[更新單一使用者資料]] UserCreate[[建立使用者]] AllUserDataQuery[[查詢所有使用者資料]] MultipleUserDateUpdate[[更新複數使用者資料]] UserDelete[[刪除使用者]] ``` **User Information ER** ```mermaid --- title: User Information Maintenance ER --- erDiagram s_user }o--|| s_role : "" s_user{ %% User Information varchar(36) acctId PK "Guid" varchar(255) acct UK "Not Null" varchar(20) adacct varchar(64) pw UK "Not Null" varchar(100) name varchar(100) email "Not Null" %%string picURL "URL" varchar(100) organizationalunit varchar(100) countryregion %% Authorization Infomation varchar(36) roleId FK "Guid" %% state Information bool active "Default: true" int state %% system Information Datetime loginon Datetime CreateOn Datetime ModifiedOn varchar(100) CreateBy varchar(100) ModifiedBy } s_role{ GUID roleId PK varchar(100) roleName "Admin/Dev/User" %% state Information bool active "Default: true" int state %% system Information Datetime CreateOn Datetime ModifiedOn varchar(100) CreateBy varchar(100) ModifiedBy } ``` note: * email設為not null 因為預計會使用email作為密碼重置所需資訊。 * CreatedBy和ModifiedBy,紀錄名字而非id。考慮到這些欄位讀取的機會比修改多,與其每次讀取都去join表,不如直接顯示名字。 **忘記密碼要求API** ```mermaid flowchart TD ResetRequest((Reset\n Request))-->Authentication[輸入帳號信箱] --> AcctEmailCheck{Acct & Email\n are correct}-->|true|GenerateNewPWD[生成新密碼]-->EncryptNewPwd[加密新密碼]-->WriteNewPWD[將新密碼密文寫入資料庫]-->SendEmail[發送含Token信件] AcctEmailCheck-->|false|AccEmailNotCorrect[/AccEmailNotCorrect/] GenerateNewPWD ``` **更改密碼API** ```mermaid flowchart TD ResetPWDtoken[/重置密碼token/] -->|Token|TokenAuthentication[驗證token] -->|OK|ResetPWDtoken2[/重置密碼token、帳號、新密碼/]-->TokenAccEmailCheck subgraph API TokenAccEmailCheck{確認帳號信箱} -->|true|EncrptNewPWD[加密新密碼]-->NewPWDWrite[寫入新密碼]--> ReturnPWDSucess[/密碼改動成功/] TokenAccEmailCheck-->|false|TokenFail[/token錯誤/] end ``` ## [Put]UserDataUpdate 這支API用作使用者進行個人資料的維護。 'AcctId'作為查詢資料庫紀錄用設計為必填。 其餘可傳入參數僅包含's_user'中部分屬性,未包括密碼(pw)及權限相關屬性(active; roleId)。 由於'Acct'作為使用者登入使用,不可 ### Request body ```csharp { "acctId": "string",//required, no empty or whitespace "acct": "string",// no empty or whitespace "adAcct": "string", "name": "string", "email": "string",// email format checked "organizationalUnit": "string", "countryRegion": "string" } ``` * **各欄位可以空缺**,但是 * AcctId為必填,會檢查是否為空字串或空白,並檢查Id是否存在。 * Acct可空缺,但若填入,會檢查是否為空字串與或空白,以及是否與既有帳號重複。 * Email可空缺,但若填入,會檢查是否符合email格式。 ### Sucess Response ```json { "id": "5a0896ca-fe83-4256-92ae-691738766496", "summary": "Compleated", "detail": "Data has Changed successfully.", "code": "200200", "info": null } ``` ### Exception Response #### **AcctId** 例外狀況回報範例 AcctId為必填,並會檢查空字串與空白 ```json //AcctId屬性空缺 { "type": "https://tools.ietf.org/html/rfc7231#section-6.5.1", "title": "One or more validation errors occurred.", "status": 400, "traceId": "00-4b1e934266f63df182108ba9afd56c9a-a4583885d82d47f6-00", "errors": { "AcctId": [ "The AcctId field is required." ] } } ``` ```json //acctId 是空字串或空白 { "id": "6f5aa86e-db2e-4ac5-834e-aa120896a9dd", "summary": "Completed With Failures", "detail": "The AcctId is required.", "code": "200401", "info": null } ``` #### **Acct** 例外狀況回報範例 Acct可空缺,但若填入,會檢查是否為空字串與或全為空白; ```json { "id": "02e409ed-d433-4348-b82b-d0e00253d47e", "summary": "Completed With Failures", "detail": "Empty fields or white spaces are not allowed for account information.", "code": "200401", "info": null } ``` #### **Email** ## [Post]UserDataCreate ### RequestPacket Spec | 欄位名稱 | 欄位中文名稱 |可填寫| 資料型態 | 必填 | Unique | 預設 | 備註 | |---------------------|--------------|---|----------|------|--------|--------------|-------------------------------| | AcctId | Id | |GUID | - | PK | - | 系統帶入GUID | | Acct | 帳號 | ✓ | - | ✓ | ✓ | - | 系統檢查是否Unique | | AdAcct | AD帳號 | ✓ |string | | - | - | | | Pw | 密碼 | ✓ | string | ✓ | - | - | 大小寫英數字 | | Name | 用戶名稱 | ✓ |string | | - |(Acct) | 若無填寫系統帶入Acct | | Email | 電子信箱 | ✓ |string | ✓ | - | - | 忘記密碼必須 | | OrganizationalUnit | 組織單位 | ✓ |string | | - | - | | | CountryRegion | 國家/區域 | ✓ |string | | - | - | | |---------------------|--------------|---|----------|------|--------|--------------|-------------------------------| | Active | 啟用狀態 | ✓ |bool | - | - | true | 角色建立預設開啟 | | State | 使用者狀態 | ✓ |int | - | - | - | 預留欄位 | | RoleId | 權限角色Id | ✓ |GUID | - | - | | | |---------------------|--------------|---|----------|------|--------|--------------|-------------------------------| | CreatedOn | 建立日期 | | DateTime | - | - | (Now()) | 建立時,系統帶入使用者建立日期 | | ModifiedOn | 修改日期 | ✓ |DateTime | - | - | (CreatedOn) | 系統帶入建立日期,其他功能再行調整 | | LoginOn | 上次登入時間 | |DateTime | - | - | - | 建立時留空 | | CreatedBy | 建立者 |✓ |GUID | - | - | | | | ModifiedBy | 上次修改者 | |GUID | - | - | - | | * '預設'欄位中,以()標示之預設值,表示在應用層由API撰寫程式帶入,並非由資料庫本身撰寫SQL語法預設帶入。 * '備註'欄僅說明建立時的動作,各欄位其他行為,紀錄於其他與該欄位互動之API的說明中。 ### Flowchart ```mermaid flowchart TD Input((使用者輸入資訊))-->RequestPacketCheck-->RequestPacketComplete-1-->DataInsertSQL[[DataInsertSQL]]-->RetreiveEstablishedData[[Retreive established user data]]-->RequestPacketComplete-2-->DataInsertSQL2[[DataInsertSQL2]]-->Accomplish subgraph RequestPacketComplete-2 IfCreateByNullInsertAcctId ModifiedByInsertCreateBy end ``` * RequestPacketCheck Tasks |流程圖區塊名稱|意義|實現方法| |---|---|---| |AcctRequired| 帳號不為空字串或空白| Attribute |AcctUnique| 帳號不得重複 | Custom Attribute |pwRequired| 密碼不得為空字串或空白| Attribute |pwFormat| 密碼8~20字,包含英數字。| Attribute |emailRequired| 電子信箱不得為空字串或空白| Attribute |emailFormat| 電子信箱須為有效格式| Attribute |IfRoldIdNotNullExists| 若RoldId非空,檢查RoldId是否存在| Custom Attribute |IfCreateByNotNullExist| 若CreateBy非空,檢查CreateBy是否存在|Custom Attribute| * RequestPacketComplete-1 Tasks |流程圖區塊名稱|意義|實現方法| |---|---|---| |userIdInserGUID|AcctId 插入guid| exec| |IfNameNullInsertAcc| 若名稱為空,預設帶入acct|exec| |IfActiveNullInsertTrue| 若Active為空,預設帶入true| c#物件預設為true| |CreateOnInsertNow|設定建立日期為現在 | exec| |ModifiedOnInsertCreateOn| 設定建立日期為CreateOn| exec| |password encrption|加密密碼|exec| --- ## 附錄 ### 用來修改使用者資料相關的sql語法。 ```sql use carbon -- CREATE TABLES s_role create table s_role ( roleId varchar(36) not null, roleName varchar(100) not null, active bool default true, state int, CreatedOn datetime, CreatedBy varchar(36), ModifiedOn datetime, ModifiedBy varchar(36), primary key (roleId) ); -- INSERT COLUMNS insert s_role (roleId, roleName, CreatedOn, CreatedBy, ModifiedOn, ModifiedBy) values (UUID(),'Developer', Now(),'Developer', Now(), 'Developer'), (UUID(),'Admin', Now(),'Developer', Now(), 'Developer'), (UUID(),'User', Now(),'Developer', Now(), 'Developer'); -- modify columns ALTER TABLE s_user MODIFY pw VARCHAR(64) NOT null, MODIFY email VARCHAR(100) NOT null; -- drop columns alter table s_user drop pic -- add columns alter table s_user ADD acctId VARCHAR(36) not null ADD countryregion VARCHAR(100), ADD active BOOL DEFAULT TRUE, ADD state INT, ADD loginon DATETIME, ADD CreatedBy VARCHAR(36), ADD ModifyBy VARCHAR(36); -- Change column's name CHANGE role roleId VARCHAR(36); -- unique constraint alter table s_user add unique(acct, pw); # one need to specify new primary key as you drop the old one. -- modify primary key ALTER TABLE s_user DROP PRIMARY key, add primary key (acctId); insert s_user (acctId, acct, adacct, pw, name, email, organizationalunit, countryregion, roleId, CreatedOn, ModifiedOn, CreatedBy, ModifiedBy) values (UUID(),'TaiweiTest','TaiweiTest','P@s^2w.rd','TaiweiTest','2200767@systex.com','B216','Taiwan','88db3df4-c000-11ee-a1b9-6045bd2120d5',Now(),Now(),'Developer','Developer'), (UUID(),'TestAdmin','TestAdmin','P@s^2w.rd2','TestAdmin','2200767@systex.com','B216','Taiwan','88db42bf-c000-11ee-a1b9-6045bd2120d5',Now(),Now(),'Developer','Developer'); -- add foreign key alter table s_user add foreign key (roleId) references s_role (roleId); ```