From b797aed0732d30d6bbc538b2b70c42206be73499 Mon Sep 17 00:00:00 2001 From: kashiuno Date: Thu, 20 Mar 2025 21:11:23 +0300 Subject: [PATCH] Fixes --- .../qr_access_admin/client/view/ClientView.java | 2 +- .../common/config/SecurityConfiguration.java | 8 ++++++++ .../door/component/DoorEditor.java | 6 ++++-- .../qr_access_admin/door/entity/DoorEntity.java | 5 +++++ .../qr_access_admin/door/view/DoorView.java | 3 +-- .../partner/view/PartnerView.java | 2 +- .../qr_access_admin/rent/entity/RentEntity.java | 2 +- .../qr_access_admin/rent/view/RentView.java | 2 +- .../UnitEntityUnitComboBoxModelMapper.java | 11 +---------- .../unit/mapper/UnitEntityUnitModelMapper.java | 16 ++++++++++------ .../qr_access_admin/unit/view/UnitView.java | 3 ++- 11 files changed, 35 insertions(+), 25 deletions(-) diff --git a/src/main/java/ru/vyatsu/qr_access_admin/client/view/ClientView.java b/src/main/java/ru/vyatsu/qr_access_admin/client/view/ClientView.java index 03ad5bd..79b545a 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/client/view/ClientView.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/client/view/ClientView.java @@ -38,7 +38,7 @@ public class ClientView extends VerticalLayout { addButton.addClickListener(e -> editClient(new ClientEntity())); - grid.setHeight("200px"); + grid.setHeight("600px"); grid.asSingleSelect().addValueChangeListener(e -> editClient(e.getValue())); refreshClientGrid(); diff --git a/src/main/java/ru/vyatsu/qr_access_admin/common/config/SecurityConfiguration.java b/src/main/java/ru/vyatsu/qr_access_admin/common/config/SecurityConfiguration.java index 5634ed3..71ce90a 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/common/config/SecurityConfiguration.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/common/config/SecurityConfiguration.java @@ -1,9 +1,12 @@ package ru.vyatsu.qr_access_admin.common.config; import com.vaadin.flow.spring.security.VaadinWebSecurity; +import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.security.config.annotation.web.builders.HttpSecurity; import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity; +import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder; +import org.springframework.security.crypto.password.PasswordEncoder; @Configuration @EnableWebSecurity @@ -14,4 +17,9 @@ public class SecurityConfiguration extends VaadinWebSecurity { super.configure(http); http.oauth2Login(c -> c.loginProcessingUrl("/login/oauth2/code/own")); } + + @Bean + public PasswordEncoder passwordEncoder() { + return new BCryptPasswordEncoder(); + } } \ No newline at end of file diff --git a/src/main/java/ru/vyatsu/qr_access_admin/door/component/DoorEditor.java b/src/main/java/ru/vyatsu/qr_access_admin/door/component/DoorEditor.java index 2323cab..6c62989 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/door/component/DoorEditor.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/door/component/DoorEditor.java @@ -8,6 +8,7 @@ import com.vaadin.flow.component.combobox.ComboBox; import com.vaadin.flow.component.icon.VaadinIcon; import com.vaadin.flow.component.orderedlayout.HorizontalLayout; import com.vaadin.flow.component.orderedlayout.VerticalLayout; +import com.vaadin.flow.component.textfield.BigDecimalField; import com.vaadin.flow.component.textfield.IntegerField; import com.vaadin.flow.component.textfield.TextField; import com.vaadin.flow.data.binder.BeanValidationBinder; @@ -170,7 +171,7 @@ public class DoorEditor extends Composite { unitField.setItemLabelGenerator(UnitComboBoxModel::clientName); IntegerField countField = new IntegerField("Количество мест"); TextField descriptionField = new TextField("Описание"); - + BigDecimalField price = new BigDecimalField("Цена за час"); var save = new Button("Сохранить", VaadinIcon.CHECK.create()); var cancel = new Button("Отмена"); @@ -180,6 +181,7 @@ public class DoorEditor extends Composite { .withConverter(UnitComboBoxModel::clientId, units::get, "Invalid value") .bind("unitId"); binder.forField(countField).bind("count"); + binder.forField(price).bind("price"); binder.forField(descriptionField).bind("description"); save.addThemeVariants(ButtonVariant.LUMO_PRIMARY); @@ -203,7 +205,7 @@ public class DoorEditor extends Composite { cancel.addClickListener(e -> cancelListener.onCancel()); VerticalLayout mainForm = new VerticalLayout(); - mainForm.add(unitField, countField, descriptionField, scheduleEditor, new HorizontalLayout(save, cancel, delete)); + mainForm.add(unitField, countField, descriptionField, price, scheduleEditor, new HorizontalLayout(save, cancel, delete)); getContent().add(mainForm, additionalDoorsEditor); } diff --git a/src/main/java/ru/vyatsu/qr_access_admin/door/entity/DoorEntity.java b/src/main/java/ru/vyatsu/qr_access_admin/door/entity/DoorEntity.java index c8e840a..e3b167a 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/door/entity/DoorEntity.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/door/entity/DoorEntity.java @@ -4,6 +4,8 @@ import jakarta.persistence.*; import lombok.Getter; import lombok.Setter; +import java.math.BigDecimal; + @Entity @Table(name = "doors") @Getter @@ -23,6 +25,9 @@ public class DoorEntity { @Column private int count; + @Column + private BigDecimal price; + @Column private String parentDoorIds; } diff --git a/src/main/java/ru/vyatsu/qr_access_admin/door/view/DoorView.java b/src/main/java/ru/vyatsu/qr_access_admin/door/view/DoorView.java index b832adb..d85ef23 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/door/view/DoorView.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/door/view/DoorView.java @@ -52,8 +52,7 @@ public class DoorView extends VerticalLayout { addButton.addClickListener(e -> editDoor(new DoorEntity())); - grid.setHeight("200px"); - + grid.setHeight("600px"); grid.asSingleSelect().addValueChangeListener(e -> editDoor(e.getValue())); refreshDoorsGrid(); diff --git a/src/main/java/ru/vyatsu/qr_access_admin/partner/view/PartnerView.java b/src/main/java/ru/vyatsu/qr_access_admin/partner/view/PartnerView.java index 6284b41..e740638 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/partner/view/PartnerView.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/partner/view/PartnerView.java @@ -38,7 +38,7 @@ public class PartnerView extends VerticalLayout { addButton.addClickListener(e -> editPartner(new PartnerEntity())); - grid.setHeight("200px"); + grid.setHeight("600px"); grid.asSingleSelect().addValueChangeListener(e -> editPartner(e.getValue())); refreshPartnerGrid(); diff --git a/src/main/java/ru/vyatsu/qr_access_admin/rent/entity/RentEntity.java b/src/main/java/ru/vyatsu/qr_access_admin/rent/entity/RentEntity.java index 7e56cb9..50a088e 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/rent/entity/RentEntity.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/rent/entity/RentEntity.java @@ -10,7 +10,7 @@ import java.time.LocalDate; import java.time.LocalDateTime; import java.time.LocalTime; -@Table(name = "rent") +@Table(name = "rents") @Entity @Getter @Setter diff --git a/src/main/java/ru/vyatsu/qr_access_admin/rent/view/RentView.java b/src/main/java/ru/vyatsu/qr_access_admin/rent/view/RentView.java index c5abadd..7f50514 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/rent/view/RentView.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/rent/view/RentView.java @@ -40,7 +40,7 @@ public class RentView extends VerticalLayout { addButton.addClickListener(e -> editRent(new RentEntity())); - grid.setHeight("200px"); + grid.setHeight("600px"); grid.asSingleSelect().addValueChangeListener(e -> editRent(e.getValue())); refreshRentGrid(); diff --git a/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitComboBoxModelMapper.java b/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitComboBoxModelMapper.java index efe6e74..38b251f 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitComboBoxModelMapper.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitComboBoxModelMapper.java @@ -1,10 +1,7 @@ package ru.vyatsu.qr_access_admin.unit.mapper; -import ru.vyatsu.qr_access_admin.unit.model.UnitComboBoxModel; import ru.vyatsu.qr_access_admin.unit.entity.UnitEntity; - -import java.util.Collection; -import java.util.List; +import ru.vyatsu.qr_access_admin.unit.model.UnitComboBoxModel; public class UnitEntityUnitComboBoxModelMapper { @@ -14,10 +11,4 @@ public class UnitEntityUnitComboBoxModelMapper { } return new UnitComboBoxModel(entity.getClientId(), entity.getClientName()); } - - public List toModels(Collection entities) { - return entities.stream() - .map(this::toModel) - .toList(); - } } diff --git a/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitModelMapper.java b/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitModelMapper.java index 9069b5f..105a233 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitModelMapper.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/unit/mapper/UnitEntityUnitModelMapper.java @@ -1,5 +1,9 @@ package ru.vyatsu.qr_access_admin.unit.mapper; +import lombok.RequiredArgsConstructor; +import org.springframework.security.crypto.password.PasswordEncoder; +import org.springframework.security.oauth2.core.AuthorizationGrantType; +import org.springframework.security.oauth2.core.ClientAuthenticationMethod; import org.springframework.stereotype.Component; import ru.vyatsu.qr_access_admin.unit.entity.UnitEntity; import ru.vyatsu.qr_access_admin.unit.model.UnitModel; @@ -8,8 +12,11 @@ import java.util.Collection; import java.util.List; @Component +@RequiredArgsConstructor public class UnitEntityUnitModelMapper { + private final PasswordEncoder passwordEncoder; + public static final String DEFAULT_CLIENT_SETTINGS = "{\"@class\":\"java.util.Collections$UnmodifiableMap\",\"settings.client.require-proof-key\":false,\"settings.client.require-authorization-consent\":false}"; private static final String DEFAULT_TOKEN_SETTINGS = """ {"@class":"java.util.Collections$UnmodifiableMap","settings.token.reuse-refresh-tokens":true,"settings.token.x509-certificate-bound-access-tokens":false,"settings.token.id-token-signature-algorithm":["org.springframework.security.oauth2.jose.jws.SignatureAlgorithm","RS256"],"settings.token.access-token-time-to-live":["java.time.Duration",31540000.000000000],"settings.token.access-token-format":{"@class":"org.springframework.security.oauth2.server.authorization.settings.OAuth2TokenFormat","value":"self-contained"},"settings.token.refresh-token-time-to-live":["java.time.Duration",3600.000000000],"settings.token.authorization-code-time-to-live":["java.time.Duration",300.000000000],"settings.token.device-code-time-to-live":["java.time.Duration",300.000000000]} @@ -19,15 +26,12 @@ public class UnitEntityUnitModelMapper { UnitEntity entity = new UnitEntity(); entity.setId(model.getId()); entity.setClientId(model.getClientId()); - // TODO: Приделать PasswordEncoder когда заедет security - entity.setClientSecret(model.getClientSecret()); + entity.setClientSecret(passwordEncoder.encode(model.getClientSecret())); entity.setClientSecretExpiresAt(model.getClientSecretExpiresAt()); entity.setClientName(model.getClientName()); entity.setScopes(""); - // TODO: Использовать enum, когда заедет oauth2 - entity.setAuthorizationGrantTypes("client_credentials"); - // TODO: Использовать enum, когда заедет oauth2 - entity.setClientAuthenticationMethods("client_secret_post"); + entity.setAuthorizationGrantTypes(AuthorizationGrantType.CLIENT_CREDENTIALS.getValue()); + entity.setClientAuthenticationMethods(ClientAuthenticationMethod.CLIENT_SECRET_POST.getValue()); entity.setClientSettings(DEFAULT_CLIENT_SETTINGS); entity.setTokenSettings(DEFAULT_TOKEN_SETTINGS); entity.setRedirectUris(""); diff --git a/src/main/java/ru/vyatsu/qr_access_admin/unit/view/UnitView.java b/src/main/java/ru/vyatsu/qr_access_admin/unit/view/UnitView.java index 59f9d7d..35b58a3 100644 --- a/src/main/java/ru/vyatsu/qr_access_admin/unit/view/UnitView.java +++ b/src/main/java/ru/vyatsu/qr_access_admin/unit/view/UnitView.java @@ -44,7 +44,7 @@ public class UnitView extends VerticalLayout { addButton.addClickListener(e -> editUnit(new UnitModel())); - grid.setHeight("200px"); + grid.setHeight("600px"); grid.asSingleSelect().addValueChangeListener(e -> editUnit(e.getValue())); refreshUnitsGrid(); @@ -69,6 +69,7 @@ public class UnitView extends VerticalLayout { editor.setVisible(false); editor.setSaveListener(unit -> { + // TODO: Сделать, чтобы секрет клиента при изменении не перехешировался, иначе станет не рабочим UnitEntity entity = entityModelMapper.mapModelToEntity(unit); unitRepository.save(entity); refreshUnitsGrid();