общий рефакторинг
This commit is contained in:
parent
b33dcd79d2
commit
af6acee675
47
README.md
Normal file
47
README.md
Normal 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
129
pom.xml
@ -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>
|
@ -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 {
|
||||
|
||||
}
|
@ -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("Идентификатор контента, к которому ставлено сообщение")
|
||||
|
@ -24,4 +24,5 @@ public class EmptyMessage extends Message {
|
||||
public void setText(String text) {
|
||||
throw new AppBotException("EmptyMessage no setText");
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ import javax.validation.constraints.NotNull;
|
||||
import java.time.LocalDateTime;
|
||||
|
||||
/**
|
||||
* Аьстрактная сущность - Сообщение от пользователя.
|
||||
* Абстрактная сущность - Сообщение от пользователя.
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
|
@ -26,4 +26,5 @@ public class AudioMessage extends Attachment {
|
||||
public AudioMessage() {
|
||||
type = AttachmentType.AUDIO_MESSAGE;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -15,6 +15,7 @@ public class GeoCoordinate {
|
||||
|
||||
@Description("Широта")
|
||||
private Float latitude;
|
||||
|
||||
@Description("Долгота")
|
||||
private Float longitude;
|
||||
|
||||
|
@ -15,10 +15,10 @@ import java.util.List;
|
||||
*
|
||||
* @author upagge [08/07/2019]
|
||||
*/
|
||||
@Builder
|
||||
@Getter
|
||||
@EqualsAndHashCode
|
||||
@Builder
|
||||
@ToString
|
||||
@EqualsAndHashCode
|
||||
public class KeyBoardLine {
|
||||
|
||||
@Description("Кнопки в строке")
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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;
|
||||
}
|
||||
|
||||
}
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -5,8 +5,6 @@ import org.springframework.data.jpa.repository.JpaRepository;
|
||||
import org.springframework.stereotype.Repository;
|
||||
|
||||
/**
|
||||
* TODO: Добавить описание интерфейса.
|
||||
*
|
||||
* @author upagge [27/07/2019]
|
||||
*/
|
||||
@Repository
|
||||
|
@ -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]
|
||||
*/
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -1,6 +0,0 @@
|
||||
package org.sadtech.social.core.service;
|
||||
|
||||
import org.sadtech.social.core.domain.content.BoardComment;
|
||||
|
||||
public interface BoardCommentService extends MessageService<BoardComment> {
|
||||
}
|
@ -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);
|
||||
|
||||
/**
|
||||
* Возвращает новые сообщения от последнего запроса.
|
||||
|
@ -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);
|
||||
|
||||
}
|
||||
|
@ -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()
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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) {
|
||||
|
@ -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);
|
||||
|
@ -53,4 +53,5 @@ public class EmailSending implements Sending {
|
||||
public SendType getType() {
|
||||
return SendType.PUBLIC;
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -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() {
|
||||
|
Loading…
Reference in New Issue
Block a user