Учебный проект по созданию базового функционала в springboot.
Внимание! в resources/certs/
лежат ключи *.pem
. В настоящем проекте они должны быть добавлены в .gitignore
!
Сущность - обычно подразумевается класс, отражающий таблицу из БД.
DTO - data transfer object. Паттерн, подразумевающий создание классов, инкапсулирующих в себя поля, которые необходимо получить, создать, обновить (create, read, update)
Mapper - класс, задающий правила автоматического преобразования сущности в DTO и обратно. Использует библиотеку mapstruct.
- Создание 100 юзеров при запуске приложения.
Необходимо:
- model:
User
- структура для записи в БД - repository:
UserRepository
- содержит CRUD для записи в БД - dto:
UserDTO
,UserCreateDTO
- указывают, какие поля необходимо заполнить для выполнения create, read, update. - mapper:
UserMapper
- инкапсулирует код преобразования сущности в DTO и обратно. - component: опционально. Класс
DataInitializerProperties
нужен для получения переменных из переменных окружения.DataInitializerProperties.getCount()
Переменная из application.yml, позволет гибко задавать кол-во юзеров для генерации во время запуска приложения. - component:
DataInitializer
- использует faker для создания юзеров.
- model:
- Частичное обновление PUT вместо PATCH - необязательно заполнять все поля для обновления сущности. При передаче поля со значением null - оно будет подставлено. Если же поле не передается, оно будет проигнорировано.
Необходимо:
- install dependency:
implementation("org.openapitools:jackson-databind-nullable:0.2.6")
- create
UserUpdateDTO
withJsonNullable
fields. - create config
JacksonConfig
and write rules for mapping (UserMapper
, etc). - create
JsonNullableMapper
and added him toUserMapper
. - create simple controllers
UserController
for updateUser
model using API. - create service
UserService
for encapsulation of business logic by separating it from http requests.
- install dependency:
- Подключен JPA Audit - автоматическая запись времени создания и обновления записи в БД.
Необходимо:
- set
@EnableJpaAuditing
in classApplication
. - modify
UserDTO
. - modify
User
model, added fieldscreatedAt
andupdatedAt
with@CreatedDate
and@LastModifiedDate
. - set @EntityListeners(AuditingEntityListener.class) on
User
model.
- set
- Перехват ошибок с помощью Advice.
Необходимо:
- create handler
GlobalExceptionHandler
. - create exception
ResourceNotFoundException
. - use this exception in controllers or service.
- create handler
- Поиск юзера по емайлу.
Необходимо:
- add
email
field with@Email
inUser
model. - add
findByEmail
method inUserRepository
. - add
getUserByEmail
method inUserService
. - add email in all user DTO's.
- add new controller.
- add
- Фильтрация и пагинация.
By default?page=1
Пример: http://localhost:8080/api/users?emailCont=is&&updatedAtGt=2024-03-23 20:18:56
Необходимо:
- update
getUsers
inUserService
. - update
getUsers
inUserController
. - add
JpaSpecificationExecutor<User>
inUserRepository
. - implements filter in
UserSpecification
. - create
UserParamsDTO
as filter params.
- update
- Авторизация.
Необходимо:
- install dependency.
- update
User
model, implementsUserDetails
. - create
CustomUserDetailsService
as CRUD for users. - add
passwordEncoder
bean for hashing password inEncodersConfig
. - create
SecurityConfig
where usingpasswordEncoder
andCustomUserDetailsService
. - create
JWTUtils
for generic jwt token. - create rsa keys and
RsaKeyProperties
. Dont pushprivate.pem
to git! This for only example.
# datafaker/src/main/resources/certs openssl genpkey -out private.pem -algorithm RSA -pkeyopt rsa_keygen_bits:2048 &&\ openssl rsa -in private.pem -pubout -out public.pem
- create
AuthRequestDTO
- create
AuthenticationController
. - add security filter for urls in
SecurityConfig
. - create
UserUtils
withgetCurrentUser
method for get authenticated user. - add
passwordDigest
inUserCreateDTO
. - add
encryptPassword
method inUserMapper
. - check generate token.
curl -X POST -H "content-type:application/json" -d '{"username":"admin@admin.ru", "password": "123"}' http://localhost:8080/api/login
- check get users with token.
curl -H "content-type:application/json" -H "authorization:bearer <token>" http://localhost:8080/api/users
- install dependency.
Other commands (before create authentication):
Get all users
curl http://localhost:8080/api/users
Get user by id
curl http://localhost:8080/api/users/1
Create User
curl -X POST -H "content-type:application/json" -d '{"firstName":"Bob", "lastName":"Marley"}' http://localhost:8080/api/users
Partial update user (JsonNullable)
curl -X PUT -H 'content-type:application/json' -d '{"lastName":"Hello"}' http://localhost:8080/api/users/1
Full update user
curl -X PUT -H 'content-type:application/json' -d '{"firstName":"NewFirstName", "lastName":"NewLastName"}' http://localhost:8080/api/users/1