общий рефакторинг

This commit is contained in:
upagge 2020-05-03 19:52:44 +03:00
parent b33dcd79d2
commit af6acee675
No known key found for this signature in database
GPG Key ID: 15CD012E46F6BA34
35 changed files with 279 additions and 208 deletions

47
README.md Normal file
View File

@ -0,0 +1,47 @@
# Social Core
Набор классов для реализации абстрактных проектов для социальных сетей и месенджеров, без привязки к конкретным реализациям.
## Общая информация
Возьмем класс `Mail`, которые отвечает за сообщение. Это одновременно конкретный и абстрактный класс. Конкретный он,
потому что у него есть определенные поля и не предполагается его дальнешее расширение разработчиком, который использует
данную библиотеку. А абстрактный он, потому что не предполагает привязки к какой-либо социальной сети.
Это может быть сообщение во ВКонтакте или Telegram, на данном уровне абстракции это не важно. Из таких обобщенных
сущностей, а так же сервисов и репозиториев к ним и состоит библиотека.
Все сущности имеют свой сервис и репозиторий для сохранения. Так же реализована JPA версия репозиториев.
## Примеры использований
1. [Social Bot](https://github.com/uPagge/social-bot) - Абстрактный SDK для бота под любую социальную сеть и мессенджер.
## Пакеты проекта
- domain - доменные сущности проекта. Например, сообщение пользователя, комментарий к фотографии, сообщение в беседе.
- content
- attachment - вложения к сообщениям пользователя. Прикрепленная фотография, или аудио, или голосовое сообщение.
- keyboard - сущности для реализации клавиаутры
- button - кнопки клавиатуры разных типов
- exception - классы для объектов исключений
- repository - интерфейсы репозиториев для доменных сущностей
- impl - реализации интерфейсов
- local - Реализация на какой-либо колекции Java (Map, List и т.к.)
- jpa - Реализация для сохранения в БД.
- jpa - Интерфейсы для работы с Spring Jpa
- service - интерфейсы сервисов для доменных сущностей
- impl - реализации интерфейсов
- sender - реализации интерфейса `Sending`
- utils - прочие классы утилиты
## Dependency
```
<dependency>
<groupId>org.sadtech.social</groupId>
<artifactId>social-bot</artifactId>
<version>0.6.3-RELEASE</version>
</dependency>
```

129
pom.xml
View File

@ -9,22 +9,28 @@
<version>0.6.3-SNAPSHOT</version>
<packaging>jar</packaging>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<name>Social Core</name>
<description>
Набор классов для реализации абстрактных проектов для социальных сетей и месенджеров, без привязки к конкретным
сервисам.
</description>
<url>https://github.com/uPagge/social-core</url>
<scm>
<connection>scm:git:https://github.com/uPagge/social-core.git</connection>
<url>https://github.com/uPagge/social-core</url>
<developerConnection>scm:git:https://github.com/uPagge/social-core.git</developerConnection>
</scm>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<properties>
<gson.ver>2.8.5</gson.ver>
<slf4j.ver>1.7.29</slf4j.ver>
<mail.ver>1.4</mail.ver>
<lombok.ver>1.18.10</lombok.ver>
<spring.data.jpa.ver>2.1.3.RELEASE</spring.data.jpa.ver>
@ -39,12 +45,6 @@
<version>${gson.ver}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.ver}</version>
</dependency>
<dependency>
<groupId>javax.mail</groupId>
<artifactId>mail</artifactId>
@ -71,13 +71,93 @@
<artifactId>validation-api</artifactId>
<version>${validation.api.ver}</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
</dependencies>
<profiles>
<profile>
<id>release</id>
<build>
<plugins>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-source-plugin</artifactId>
<version>2.2.1</version>
<executions>
<execution>
<id>attach-sources</id>
<goals>
<goal>jar-no-fork</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-javadoc-plugin</artifactId>
<version>2.9.1</version>
<executions>
<execution>
<id>attach-javadocs</id>
<goals>
<goal>jar</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-gpg-plugin</artifactId>
<version>1.5</version>
<executions>
<execution>
<id>sign-artifacts</id>
<phase>verify</phase>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.sonatype.plugins</groupId>
<artifactId>nexus-staging-maven-plugin</artifactId>
<version>1.6.7</version>
<extensions>true</extensions>
<configuration>
<serverId>ossrh</serverId>
<nexusUrl>https://oss.sonatype.org/</nexusUrl>
<autoReleaseAfterClose>true</autoReleaseAfterClose>
</configuration>
</plugin>
</plugins>
</build>
</profile>
</profiles>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<configuration>
<source>8</source>
<target>8</target>
</configuration>
</plugin>
</plugins>
</build>
<developers>
<developer>
<id>uPagge</id>
@ -87,5 +167,4 @@
</developer>
</developers>
</project>

View File

@ -1,15 +0,0 @@
package org.sadtech.social.core.config;
import org.springframework.boot.autoconfigure.domain.EntityScan;
import org.springframework.data.jpa.repository.config.EnableJpaRepositories;
/**
* Конфигуратор для использования в {@link org.springframework.context.annotation.Import}.
*
* @author upagge [28/07/2019]
*/
@EnableJpaRepositories(basePackages = "org.sadtech.social.core.repository.jpa")
@EntityScan(basePackages = "org.sadtech.social.core.domain")
public class SocialJpaSpringConfig {
}

View File

@ -1,7 +1,8 @@
package org.sadtech.social.core.domain.content;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.sadtech.social.core.utils.Description;
/**
@ -9,8 +10,9 @@ import org.sadtech.social.core.utils.Description;
*
* @author upagge [08/07/2019]
*/
@Getter
@Setter
@EqualsAndHashCode(callSuper = true)
@Data
public abstract class Comment extends Message {
@Description("Идентификатор контента, к которому ставлено сообщение")

View File

@ -24,4 +24,5 @@ public class EmptyMessage extends Message {
public void setText(String text) {
throw new AppBotException("EmptyMessage no setText");
}
}

View File

@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull;
import java.time.LocalDateTime;
/**
* Аьстрактная сущность - Сообщение от пользователя.
* Абстрактная сущность - Сообщение от пользователя.
*
* @author upagge [08/07/2019]
*/

View File

@ -26,4 +26,5 @@ public class AudioMessage extends Attachment {
public AudioMessage() {
type = AttachmentType.AUDIO_MESSAGE;
}
}

View File

@ -15,6 +15,7 @@ public class GeoCoordinate {
@Description("Широта")
private Float latitude;
@Description("Долгота")
private Float longitude;

View File

@ -15,10 +15,10 @@ import java.util.List;
*
* @author upagge [08/07/2019]
*/
@Builder
@Getter
@EqualsAndHashCode
@Builder
@ToString
@EqualsAndHashCode
public class KeyBoardLine {
@Description("Кнопки в строке")

View File

@ -14,8 +14,8 @@ import org.sadtech.social.core.utils.Description;
* @author upagge [08/07/2019]
*/
@Getter
@EqualsAndHashCode(callSuper = true)
@ToString
@EqualsAndHashCode(callSuper = true)
public class KeyBoardButtonAccount extends KeyBoardButton {
@Description("Сумма к оплате")
@ -34,4 +34,5 @@ public class KeyBoardButtonAccount extends KeyBoardButton {
this.accountId = accountId;
this.description = description;
}
}

View File

@ -10,8 +10,8 @@ import org.sadtech.social.core.domain.keyboard.KeyBoardButton;
import org.sadtech.social.core.utils.Description;
@Getter
@EqualsAndHashCode(callSuper = true)
@ToString
@EqualsAndHashCode(callSuper = true)
public class KeyBoardButtonText extends KeyBoardButton {
@Description("Надпись на кнопке")
@ -30,4 +30,5 @@ public class KeyBoardButtonText extends KeyBoardButton {
public static KeyBoardButtonText of(String label) {
return KeyBoardButtonText.builder().label(label).build();
}
}

View File

@ -6,7 +6,9 @@ package org.sadtech.social.core.exception;
* @author upagge [08/07/2019]
*/
public class AccessException extends AppBotException {
public AccessException(String message) {
super(message);
}
}

View File

@ -11,17 +11,11 @@ public class AppBotException extends RuntimeException {
private static final String TYPE = "ERROR";
private final LocalDateTime timeError = LocalDateTime.now();
protected String description;
public AppBotException(String message) {
super(message);
}
public AppBotException(String message, String description) {
super(message);
this.description = description;
}
public String getType() {
return TYPE;
}
@ -30,7 +24,4 @@ public class AppBotException extends RuntimeException {
return timeError;
}
public String getDescription() {
return description;
}
}

View File

@ -6,7 +6,9 @@ package org.sadtech.social.core.exception;
* @author upagge [11/07/2019]
*/
public class ConfigAppException extends AppBotException {
public ConfigAppException(String message) {
super(message);
}
}

View File

@ -1,7 +1,10 @@
package org.sadtech.social.core.repository;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account;
import java.util.Optional;
/**
* Репозиторий для взаимодействия с хранилищем счетов {@link Account}.
*
@ -9,10 +12,10 @@ import org.sadtech.social.core.domain.money.Account;
*/
public interface AccountRepository {
Integer add(Account account);
Account save(@NonNull Account account);
void edit(Integer accountId, Account account);
Optional<Account> findById(@NonNull Integer accountId);
Account findById(Integer accountId);
boolean existsById(Integer id);
}

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.repository;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message;
import java.time.LocalDateTime;
@ -18,17 +19,17 @@ public interface ContentRepository<T extends Message> {
* @param content Объект сообщени
* @return Идентификатор сообщения в хранилище
*/
T add(T content);
T add(@NonNull T content);
/**
* Получить все сообщения за определенный временной диапазон
*
* @param timeFrom Начало временного диапазона
* @param timeTo Конец диапазона
* @param dateFrom Начало временного диапазона
* @param dateTo Конец диапазона
* @return Список сообщений
*/
List<T> betweenByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo);
List<T> betweenByCreateDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo);
List<T> betweenByAddDateTime(LocalDateTime from, LocalDateTime to);
List<T> betweenByAddDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo);
}

View File

@ -1,13 +1,14 @@
package org.sadtech.social.core.repository.impl.jpa;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.sadtech.social.core.domain.money.Account;
import org.sadtech.social.core.repository.AccountRepository;
import org.sadtech.social.core.repository.jpa.AccountRepositoryJpa;
import java.util.Optional;
/**
* TODO: Добавить описание класса.
*
* @author upagge [27/07/2019]
*/
@RequiredArgsConstructor
@ -16,18 +17,18 @@ public class AccountRepositoryJpaImpl implements AccountRepository {
private final AccountRepositoryJpa accountRepositoryJpa;
@Override
public Integer add(Account account) {
return accountRepositoryJpa.saveAndFlush(account).getId();
public Account save(@NonNull Account account) {
return accountRepositoryJpa.save(account);
}
@Override
public void edit(Integer accountId, Account account) {
account.setId(accountId);
accountRepositoryJpa.saveAndFlush(account);
public Optional<Account> findById(@NonNull Integer accountId) {
return accountRepositoryJpa.findById(accountId);
}
@Override
public Account findById(Integer accountId) {
return accountRepositoryJpa.getOne(accountId);
public boolean existsById(Integer id) {
return accountRepositoryJpa.existsById(id);
}
}

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.repository.impl.jpa;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.sadtech.social.core.domain.content.Mail;
import org.sadtech.social.core.repository.ContentRepository;
@ -19,18 +20,18 @@ public class MailRepositoryJpaImpl implements ContentRepository<Mail> {
private final MailRepositoryJpa mailRepositoryJpa;
@Override
public Mail add(Mail content) {
public Mail add(@NonNull Mail content) {
return mailRepositoryJpa.saveAndFlush(content);
}
@Override
public List<Mail> betweenByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
return mailRepositoryJpa.findByCreateDateBetween(timeFrom, timeTo);
public List<Mail> betweenByCreateDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
return mailRepositoryJpa.findByCreateDateBetween(dateFrom, dateTo);
}
@Override
public List<Mail> betweenByAddDateTime(LocalDateTime from, LocalDateTime to) {
return mailRepositoryJpa.findByAddDateBetween(from, to);
public List<Mail> betweenByAddDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
return mailRepositoryJpa.findByAddDateBetween(dateFrom, dateTo);
}
}

View File

@ -1,9 +1,7 @@
package org.sadtech.social.core.repository.impl.local;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account;
import org.sadtech.social.core.exception.AccessException;
import org.sadtech.social.core.exception.NotFoundException;
import org.sadtech.social.core.exception.PaymentException;
import org.sadtech.social.core.repository.AccountRepository;
import java.util.HashMap;
@ -13,36 +11,25 @@ import java.util.Optional;
public class AccountRepositoryMap implements AccountRepository {
private final Map<Integer, Account> saveMap = new HashMap<>();
private Integer id = 1;
private int id = 1;
@Override
public Integer add(Account account) {
if (check(account.getId())) {
public Account save(@NonNull Account account) {
if (existsById(account.getId())) {
account.setId(id);
saveMap.put(id, account);
return id++;
return saveMap.put(id++, account);
} else {
throw new AccessException("Счет " + account.getId() + " уже существует");
}
}
@Override
public void edit(Integer accountId, Account account) {
if (check(id)) {
account.setId(accountId);
saveMap.put(accountId, account);
} else {
throw new NotFoundException("Счет " + accountId + " не найден");
return saveMap.put(id, account);
}
}
@Override
public Account findById(Integer accountId) {
return Optional.ofNullable(saveMap.get(accountId)).orElseThrow(() -> new PaymentException("Счет " + accountId + " не найден"));
public Optional<Account> findById(@NonNull Integer accountId) {
return Optional.ofNullable(saveMap.get(accountId));
}
private boolean check(Integer id) {
public boolean existsById(Integer id) {
return !saveMap.containsKey(id);
}
}

View File

@ -1,50 +0,0 @@
package org.sadtech.social.core.repository.impl.local;
import org.sadtech.social.core.domain.content.BoardComment;
import org.sadtech.social.core.repository.ContentRepository;
import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class BoardCommentRepositoryMap implements ContentRepository<BoardComment> {
private final Map<Long, BoardComment> saveMap = new HashMap<>();
private Long count = 0L;
@Override
public BoardComment add(BoardComment comment) {
comment.setId(count);
saveMap.put(count++, comment);
return comment;
}
@Override
public List<BoardComment> betweenByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
ArrayList<BoardComment> rezultMails = new ArrayList<>();
for (int i = saveMap.size() - 1; i >= 0; i--) {
if (!(saveMap.get(i).getCreateDate().isBefore(timeFrom) || saveMap.get(i).getCreateDate().isAfter(timeTo)) && saveMap.get(i).getCreateDate().equals(timeFrom)) {
rezultMails.add(this.saveMap.get(i));
} else if (saveMap.get(i).getCreateDate().isBefore(timeFrom)) {
break;
}
}
return rezultMails;
}
@Override
public List<BoardComment> betweenByAddDateTime(LocalDateTime from, LocalDateTime to) {
ArrayList<BoardComment> rezultMails = new ArrayList<>();
for (int i = saveMap.size() - 1; i >= 0; i--) {
if (!(saveMap.get(i).getAddDate().isBefore(from) || saveMap.get(i).getAddDate().isAfter(to)) && saveMap.get(i).getAddDate().equals(from)) {
rezultMails.add(this.saveMap.get(i));
} else if (saveMap.get(i).getCreateDate().isBefore(to)) {
break;
}
}
return rezultMails;
}
}

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.repository.impl.local;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.social.core.domain.content.Mail;
import org.sadtech.social.core.repository.ContentRepository;
@ -27,13 +28,13 @@ public class MailRepositoryList implements ContentRepository<Mail> {
}
@Override
public List<Mail> betweenByCreateDateTime(LocalDateTime from, LocalDateTime to) {
public List<Mail> betweenByCreateDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
ArrayList<Mail> rezultMails = new ArrayList<>();
for (int i = mails.size() - 1; i >= 0; i--) {
Mail mail = mails.get(i);
if (isTimePeriod(from, to, mail.getAddDate())) {
if (isTimePeriod(dateFrom, dateTo, mail.getAddDate())) {
rezultMails.add(mail);
} else if (mail.getCreateDate().isBefore(from)) {
} else if (mail.getCreateDate().isBefore(dateFrom)) {
break;
}
}
@ -41,22 +42,22 @@ public class MailRepositoryList implements ContentRepository<Mail> {
}
@Override
public List<Mail> betweenByAddDateTime(LocalDateTime from, LocalDateTime to) {
public List<Mail> betweenByAddDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
ArrayList<Mail> rezultMails = new ArrayList<>();
for (int i = mails.size() - 1; i >= 0; i--) {
Mail mail = mails.get(i);
LocalDateTime addDate = mail.getAddDate();
if (isTimePeriod(from, to, addDate)) {
if (isTimePeriod(dateFrom, dateTo, addDate)) {
rezultMails.add(mail);
} else if (addDate.isBefore(from)) {
} else if (addDate.isBefore(dateFrom)) {
break;
}
}
return rezultMails;
}
private boolean isTimePeriod(LocalDateTime from, LocalDateTime to, LocalDateTime dateTime) {
return from.isBefore(dateTime) && to.isAfter(dateTime);
private boolean isTimePeriod(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo, @NonNull LocalDateTime dateTime) {
return dateFrom.isBefore(dateTime) && dateTo.isAfter(dateTime);
}

View File

@ -5,8 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* TODO: Добавить описание интерфейса.
*
* @author upagge [27/07/2019]
*/
@Repository

View File

@ -1,6 +1,7 @@
package org.sadtech.social.core.repository.jpa;
import org.sadtech.social.core.domain.content.Mail;
import org.sadtech.social.core.repository.impl.jpa.MailRepositoryJpaImpl;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
@ -9,7 +10,7 @@ import java.util.List;
/**
* Интерфейс JPA репозитория для сущности {@link Mail}. При этом сам не является репозиторием, а подставляется в
* {@link org.sadtech.social.core.repository.impl.jpa.MailRepositoryJpaImpl}
* {@link MailRepositoryJpaImpl}
*
* @author upagge [27/07/2019]
*/

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account;
/**
@ -9,7 +10,7 @@ import org.sadtech.social.core.domain.money.Account;
*/
public interface AccountService {
Integer add(Account account);
Account add(@NonNull Account account);
/**
* Метод для оплаты счета
@ -19,7 +20,7 @@ public interface AccountService {
* @param sum Сумма оплаты
* @return true - в случае успешной оплаты
*/
Boolean pay(Integer accountId, Integer extinguishedPersonId, Integer sum);
boolean pay(@NonNull Integer accountId, @NonNull Integer extinguishedPersonId, @NonNull Integer sum);
/**
* Проверка оплаты счета
@ -27,6 +28,6 @@ public interface AccountService {
* @param accountId Идентификатор счета
* @return true - если счет оплачен
*/
Boolean paymentVerification(Integer accountId);
boolean paymentVerification(@NonNull Integer accountId);
}

View File

@ -1,6 +0,0 @@
package org.sadtech.social.core.service;
import org.sadtech.social.core.domain.content.BoardComment;
public interface BoardCommentService extends MessageService<BoardComment> {
}

View File

@ -1,18 +1,19 @@
package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message;
import java.time.LocalDateTime;
import java.util.List;
/**
* Интерфейс взаимодйствия с наследниками текстовых запросов пользователей.
* Интерфейс взаимодйствия с наследниками текстовых сообщений пользователей.
*
* @author upagge [08/07/2019]
*/
public interface MessageService<T extends Message> {
void add(T event);
void add(@NonNull T event);
/**
* Получить список сообщений за заданный временной интервал
@ -21,7 +22,7 @@ public interface MessageService<T extends Message> {
* @param timeTo Конец интервала
* @return Список сообщений
*/
List<T> getByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo);
List<T> getByAddDateTime(@NonNull LocalDateTime timeFrom, @NonNull LocalDateTime timeTo);
/**
* Получить список ПОСЛЕДНИХ сообщений для каждого пользователя за заданных временной интервал
@ -30,9 +31,9 @@ public interface MessageService<T extends Message> {
* @param timeTo Конец интервала
* @return Список сообщений
*/
List<T> getLastEventByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo);
List<T> getLastEventByCreateDateTime(@NonNull LocalDateTime timeFrom, @NonNull LocalDateTime timeTo);
List<T> getLastEventByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo);
List<T> getLastEventByAddDateTime(@NonNull LocalDateTime timeFrom, @NonNull LocalDateTime timeTo);
/**
* Возвращает новые сообщения от последнего запроса.

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message;
/**
@ -11,6 +12,6 @@ import org.sadtech.social.core.domain.content.Message;
@FunctionalInterface
public interface Modifiable<T extends Message> {
void change(T content);
void change(@NonNull T content);
}

View File

@ -1,8 +1,11 @@
package org.sadtech.social.core.service.impl;
import lombok.NonNull;
import lombok.RequiredArgsConstructor;
import org.sadtech.social.core.domain.money.Account;
import org.sadtech.social.core.domain.money.AccountStatus;
import org.sadtech.social.core.exception.AccessException;
import org.sadtech.social.core.exception.NotFoundException;
import org.sadtech.social.core.exception.PaymentException;
import org.sadtech.social.core.repository.AccountRepository;
import org.sadtech.social.core.service.AccountService;
@ -13,22 +16,27 @@ public class AccountServiceImpl implements AccountService {
private final AccountRepository accountRepository;
@Override
public Integer add(Account account) {
account.setAccountStatus(AccountStatus.EXPOSED);
return accountRepository.add(account);
public Account add(@NonNull Account account) {
if (accountRepository.existsById(account.getId())) {
account.setAccountStatus(AccountStatus.EXPOSED);
return accountRepository.save(account);
} else {
throw new AccessException("Счет " + account.getId() + " уже присутствует в базе");
}
}
@Override
public Boolean pay(Integer accountId, Integer extinguishedPersonId, Integer sum) {
Account account = accountRepository.findById(accountId);
public boolean pay(@NonNull Integer accountId, @NonNull Integer extinguishedPersonId, @NonNull Integer sum) {
Account account = accountRepository.findById(accountId)
.orElseThrow(() -> new NotFoundException("Счет " + accountId + " не найден"));
if (validStatus(account.getAccountStatus())) {
if (account.getTotalSum().equals(sum)) {
account.setAccountStatus(AccountStatus.CLOSED);
account.setExtinguishedPersonId(extinguishedPersonId);
accountRepository.edit(accountId, account);
accountRepository.save(account);
} else {
account.setAccountStatus(AccountStatus.EXCEPTION);
accountRepository.edit(accountId, account);
accountRepository.save(account);
throw new PaymentException("Неверная сумма");
}
} else {
@ -37,12 +45,17 @@ public class AccountServiceImpl implements AccountService {
return true;
}
private boolean validStatus(AccountStatus accountStatus) {
private boolean validStatus(@NonNull AccountStatus accountStatus) {
return AccountStatus.EXCEPTION.equals(accountStatus) || AccountStatus.EXPOSED.equals(accountStatus);
}
@Override
public Boolean paymentVerification(Integer accountId) {
return AccountStatus.CLOSED.equals(accountRepository.findById(accountId).getAccountStatus());
public boolean paymentVerification(@NonNull Integer accountId) {
return AccountStatus.CLOSED.equals(
accountRepository.findById(accountId)
.orElseThrow(() -> new NotFoundException("Счет " + accountId + " не найден"))
.getAccountStatus()
);
}
}

View File

@ -4,7 +4,7 @@ import lombok.RequiredArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.sadtech.social.core.domain.content.BoardComment;
import org.sadtech.social.core.repository.ContentRepository;
import org.sadtech.social.core.service.BoardCommentService;
import org.sadtech.social.core.service.MessageService;
import java.time.LocalDateTime;
import java.util.ArrayList;
@ -14,7 +14,7 @@ import java.util.Set;
@Slf4j
@RequiredArgsConstructor
public class BoardCommentServiceImpl implements BoardCommentService {
public class BoardCommentServiceImpl implements MessageService<BoardComment> {
private final ContentRepository<BoardComment> commentRepository;
@ -25,26 +25,26 @@ public class BoardCommentServiceImpl implements BoardCommentService {
@Override
public List<BoardComment> getByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
return null;
throw new IllegalStateException("Не реализовано");
}
@Override
public List<BoardComment> getLastEventByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.info("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
log.trace("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
List<BoardComment> mails = commentRepository.betweenByCreateDateTime(timeFrom, timeTo);
return getBoardComments(mails);
}
@Override
public List<BoardComment> getLastEventByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.info("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
log.trace("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
List<BoardComment> mails = commentRepository.betweenByAddDateTime(timeFrom, timeTo);
return getBoardComments(mails);
}
@Override
public List<BoardComment> getNewMessage() {
return null;
throw new IllegalStateException("Не реализовано");
}
private List<BoardComment> getBoardComments(List<BoardComment> mails) {

View File

@ -27,18 +27,18 @@ public class MailServiceImpl implements MailService {
public void add(Mail mail) {
mailRepository.add(mail);
newMessage = true;
log.info("Сообщение добавлено в репозиторий | {}", mail);
log.trace("Сообщение добавлено в репозиторий | {}", mail);
}
@Override
public List<Mail> getByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.debug("Запрошены все сообщения {} - {} ", timeFrom, timeTo);
log.trace("Запрошены все сообщения {} - {} ", timeFrom, timeTo);
return mailRepository.betweenByAddDateTime(timeFrom, timeTo);
}
@Override
public List<Mail> getLastEventByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.debug("Запрошены последние сообщения {} - {} ", timeFrom, timeTo);
log.trace("Запрошены последние сообщения {} - {} ", timeFrom, timeTo);
List<Mail> mails = mailRepository.betweenByCreateDateTime(timeFrom, timeTo);
if (mails != null && !mails.isEmpty()) {
return getReturnMails(mails);
@ -49,7 +49,7 @@ public class MailServiceImpl implements MailService {
@Override
public List<Mail> getLastEventByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.debug("Запрошены последние сообщения {} - {} ", timeFrom, timeTo);
log.trace("Запрошены последние сообщения {} - {} ", timeFrom, timeTo);
List<Mail> mails = mailRepository.betweenByAddDateTime(timeFrom, timeTo);
if (mails != null && !mails.isEmpty()) {
return getReturnMails(mails);

View File

@ -53,4 +53,5 @@ public class EmailSending implements Sending {
public SendType getType() {
return SendType.PUBLIC;
}
}

View File

@ -7,9 +7,10 @@ package org.sadtech.social.core.utils;
*/
public class ExceptionMessages {
public final static String UTILITY_CLASS = "Класс утилита";
public static final String UTILITY_CLASS = "Класс утилита";
private ExceptionMessages() {
throw new IllegalStateException(UTILITY_CLASS);
}
}

View File

@ -1,11 +1,11 @@
package org.sadtech.social.core.utils;
import lombok.NonNull;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
/**
* Класс для вставки слов в текстовую строку вместо подстрок - шаблонов маркеров.
*
@ -16,7 +16,7 @@ public class InsertWords {
private static final Pattern pattern = Pattern.compile("\\{(\\d+)}");
private InsertWords() {
throw new IllegalStateException(UTILITY_CLASS);
throw new IllegalStateException(ExceptionMessages.UTILITY_CLASS);
}
/**
@ -26,7 +26,7 @@ public class InsertWords {
* @param words Список слов, которые необходимо поместить вместо шаблона
* @return Модифицированная строка
*/
public static String insert(String text, List<String> words) {
public static String insert(@NonNull String text, List<String> words) {
Matcher m = pattern.matcher(text);
StringBuffer result = new StringBuffer();
while (m.find()) {
@ -39,6 +39,7 @@ public class InsertWords {
m.appendTail(result);
return result.toString();
}
}

View File

@ -3,8 +3,6 @@ package org.sadtech.social.core.utils;
import org.sadtech.social.core.domain.content.EmptyMessage;
import org.sadtech.social.core.domain.content.Message;
import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
/**
* Класс для хранения объекта заглушки для {@link Message}.
*
@ -12,11 +10,10 @@ import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
*/
public class MessageUtils {
private MessageUtils() {
throw new IllegalStateException(UTILITY_CLASS);
}
public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage();
private MessageUtils() {
throw new IllegalStateException(ExceptionMessages.UTILITY_CLASS);
}
}

View File

@ -7,6 +7,11 @@ import org.sadtech.social.core.service.sender.Sending;
import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
/**
* Используется для отправки сообщений определенного типа.
*
* @author upagge
*/
public class Sender {
private Sender() {