# Chia việc đồ án Design Pattern (Validation Project)
## A. THÔNG TIN
### 1. Đề bài
- https://courses.fit.hcmus.edu.vn/mod/resource/view.php?id=96377
### 2. Mã nguồn
- **MỚI: [phuongnam195/validation-framework](https://github.com/phuongnam195/validation-framework)**
- CŨ: [hoangng26/Validation-Framework](https://github.com/hoangng26/Validation-Framework)
### 3. Môi trường lập trình
- C#
- .NET 7.0
- Visual Studio 2022 17.4.3
### 4. Tham khảo
- [hoanganhgo/Validation-Project](https://github.com/hoanganhgo/Validation-Project)
- [bgalek/validation-framework](https://github.com/bgalek/validation-framework)
## B1. DANH SÁCH CÔNG VIỆC (MỚI)
**[MÃ NGUỒN MỚI](https://github.com/phuongnam195/validation-framework)**
**DEADLINE: 23:00 ngày 23/12 (thứ 6)**
### 1. Vẽ sơ đồ lớp dựa trên mã nguồn (Tín)
- Các lớp:
- Validator, DefaultValidator
- ValidatorBuilder, DefaultValidatorBuilder
- ValidatorFactory
- ValidationResult, PositiveValidationResult, NegativeValidationResult
- FailureInfo
- Constraint, ConcreteConstraint (đại diện cho EmailAddressConstraint, MaxLengthConstraint,...)
- ValidationAttribute, ConcreteValidationAttribute
- ValidationException, ConcreteValidationException
- RegexUtils
- Các đường relationship
### 2. Bổ sung mã nguồn (Hoàng)
- Bổ sung 2 hoặc 3 constraint cho Constraint/DateTime và Constraint/Number
- Tham khảo các lớp trong Constraint/Text
- Không cần viết test, miễn là build ValidationFramework thành công
- Viết API cho framework mới
- Tạo project Server (ngang hàng Test, ValidationFramework)
- Giữ lại code FE
### 3. Viết báo cáo dựa trên mã nguồn (A. Nguyện)
- Xem code để viết báo cáo
- Mô tả các lớp được đề cập trong [B1.1](#1-V%E1%BA%BD-s%C6%A1-%C4%91%E1%BB%93-l%E1%BB%9Bp-d%E1%BB%B1a-tr%C3%AAn-m%C3%A3-ngu%E1%BB%93n-T%C3%ADn)
## B2. DANH SÁCH CÔNG VIỆC (CŨ)
### 1. Vẽ sơ đồ lớp [A. Nguyện + Tín]
- Đủ 6 yêu cầu chức năng **cơ bản**:
- Nghiên cứu chức năng 1, 3, 5 (Tín)
- Nghiên cứu chức năng 2, 4, 6 (A. Nguyện)
- Thoả mãn yêu cầu chức năng **mở rộng**
- Mô tả chức năng của mỗi class
- Deadline: **23:00, 10/12/2022**
### 2. Code framework dựa trên sơ đồ lớp [Hoàng]
- Deadline: **23:00, 15/12/2022**
### 3. Làm báo cáo [Nam]
- Cả 2 phần
- Gom bài và nộp bài
- Deadline: **24/12/2022**
## C. Giải thích đề bài
### 1. Validation framework của bạn cần hỗ trợ các thao tác cơ bản:
#### a) 1. Cơ chế thông báo khi data không valid
- Tổng hợp các thông báo
- Có các cách khác nhau để thể hiện thông báo trên giao diện
- Trả về string (if not valid) hoặc null/empty (if valid)
- Log lỗi ra console
- Binding với text field
- Trả về bằng REST API
#### b) 2. Thao tác thiết lập valid bằng code
- Tự kiểm tra với code thêm vào
- Truyền callback với return type là boolean
```java=
Validator<MovieCharacter> characterValidator = Validator.of(MovieCharacter.class)
.validation(movieStar -> movieStar.value.length() > 0, "Name needs to has to be at least 1 character long")
.ensure();
```
#### c) 3. Thao tác thiết lập valid tự động thông qua khai báo ràng buộc dữ liệu
- Ví dụ sử dụng attributes trong .NET
- [Cách tạo Attributes trong C#](https://learn.microsoft.com/en-us/dotnet/csharp/programming-guide/concepts/attributes/creating-custom-attributes)
- Tham khảo mã nguồn C#:
- B1: Tạo project C# (console/GUI)
- B2: Copy paste class sau
```csharp=
using System.ComponentModel.DataAnnotations;
public class RegisterEmailAddressViewModel
{
[Required]
public int UserId { get; set; }
[DataType(DataType.EmailAddress)]
public string Email { get; set; }
[Compare("Email", ErrorMessage = "Verify email is invalid")]
public string EmailVerify { get; set; }
}
```
- B3: Truy cập `Required`, `DataType`, `Compare` để xem mã nguồn
#### d) 4. Có thể kết hợp các validation với nhau cho cùng kiểu dữ liệu
- Ví dụ: vừa thiết lập kiểm tra chuỗi rỗng, chuỗi chỉ toàn ký tự,…
- Chuỗi liên tiếp
```java=
Validator<MovieCharacter> characterValidator = Validator.of(MovieCharacter.class)
.validation(movieStar -> movieStar.value.length() > 0, "Name needs to has to be at least 1 character long")
.validation(movieStar -> Character.isUpperCase(movieStar.value.charAt(0)), "Name needs to start with uppercase letter")
.validation(movieStar -> movieStar.value.length() < 50, "Name needs to has to be shorter than 50 characters")
.ensure();
```
#### e) 5. Hỗ trợ kết hợp regular expression
- Đầu vào là lớp Regex của `System.Text.RegularExpressions`
- hoặc Đầu vào là string
#### f) 6. Cho phép tạo custom validation
- Kế thừa và override các method, attribute phục vụ cho validate
### 2. Validation framework được xây dựng dựa trên các lớp đối tượng với các phương thức phù hợp:
#### a) Có thể sử dụng reflection hoặc attribute (C#) hoặc annotation (Java) để đọc các thông tin mô tả ràng buộc các trường dữ liệu.
- [Mục C.1.c](#c-3.-Thao-tác-thiết-lập-valid-tự-động-thông-qua-khai-báo-ràng-buộc-dữ-liệu)
#### b) Xây dựng các lớp cơ bản hỗ trợ validation cho các kiểu dữ liệu cơ bản
- string, int, double, char
#### c) Xây dựng các lớp xử lý để thực hiện validation
### 3. Framework phải được xây dựng sao cho đảm bảo tính kế thừa và mở rộng để thêm các validation dễ dàng.