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

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> <version>0.6.3-SNAPSHOT</version>
<packaging>jar</packaging> <packaging>jar</packaging>
<build> <name>Social Core</name>
<plugins> <description>
<plugin> Набор классов для реализации абстрактных проектов для социальных сетей и месенджеров, без привязки к конкретным
<groupId>org.apache.maven.plugins</groupId> сервисам.
<artifactId>maven-compiler-plugin</artifactId> </description>
<configuration> <url>https://github.com/uPagge/social-core</url>
<source>8</source>
<target>8</target> <scm>
</configuration> <connection>scm:git:https://github.com/uPagge/social-core.git</connection>
</plugin> <url>https://github.com/uPagge/social-core</url>
</plugins> <developerConnection>scm:git:https://github.com/uPagge/social-core.git</developerConnection>
</build> </scm>
<distributionManagement>
<snapshotRepository>
<id>ossrh</id>
<url>https://oss.sonatype.org/content/repositories/snapshots</url>
</snapshotRepository>
</distributionManagement>
<properties> <properties>
<gson.ver>2.8.5</gson.ver> <gson.ver>2.8.5</gson.ver>
<slf4j.ver>1.7.29</slf4j.ver>
<mail.ver>1.4</mail.ver> <mail.ver>1.4</mail.ver>
<lombok.ver>1.18.10</lombok.ver> <lombok.ver>1.18.10</lombok.ver>
<spring.data.jpa.ver>2.1.3.RELEASE</spring.data.jpa.ver> <spring.data.jpa.ver>2.1.3.RELEASE</spring.data.jpa.ver>
@ -39,12 +45,6 @@
<version>${gson.ver}</version> <version>${gson.ver}</version>
</dependency> </dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>${slf4j.ver}</version>
</dependency>
<dependency> <dependency>
<groupId>javax.mail</groupId> <groupId>javax.mail</groupId>
<artifactId>mail</artifactId> <artifactId>mail</artifactId>
@ -71,13 +71,93 @@
<artifactId>validation-api</artifactId> <artifactId>validation-api</artifactId>
<version>${validation.api.ver}</version> <version>${validation.api.ver}</version>
</dependency> </dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-autoconfigure</artifactId>
<version>2.1.3.RELEASE</version>
</dependency>
</dependencies> </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> <developers>
<developer> <developer>
<id>uPagge</id> <id>uPagge</id>
@ -87,5 +167,4 @@
</developer> </developer>
</developers> </developers>
</project> </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; package org.sadtech.social.core.domain.content;
import lombok.Data;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter;
import lombok.Setter;
import org.sadtech.social.core.utils.Description; import org.sadtech.social.core.utils.Description;
/** /**
@ -9,8 +10,9 @@ import org.sadtech.social.core.utils.Description;
* *
* @author upagge [08/07/2019] * @author upagge [08/07/2019]
*/ */
@Getter
@Setter
@EqualsAndHashCode(callSuper = true) @EqualsAndHashCode(callSuper = true)
@Data
public abstract class Comment extends Message { public abstract class Comment extends Message {
@Description("Идентификатор контента, к которому ставлено сообщение") @Description("Идентификатор контента, к которому ставлено сообщение")

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@ -1,7 +1,10 @@
package org.sadtech.social.core.repository; package org.sadtech.social.core.repository;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account; import org.sadtech.social.core.domain.money.Account;
import java.util.Optional;
/** /**
* Репозиторий для взаимодействия с хранилищем счетов {@link Account}. * Репозиторий для взаимодействия с хранилищем счетов {@link Account}.
* *
@ -9,10 +12,10 @@ import org.sadtech.social.core.domain.money.Account;
*/ */
public interface AccountRepository { 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; package org.sadtech.social.core.repository;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message; import org.sadtech.social.core.domain.content.Message;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -18,17 +19,17 @@ public interface ContentRepository<T extends Message> {
* @param content Объект сообщени * @param content Объект сообщени
* @return Идентификатор сообщения в хранилище * @return Идентификатор сообщения в хранилище
*/ */
T add(T content); T add(@NonNull T content);
/** /**
* Получить все сообщения за определенный временной диапазон * Получить все сообщения за определенный временной диапазон
* *
* @param timeFrom Начало временного диапазона * @param dateFrom Начало временного диапазона
* @param timeTo Конец диапазона * @param dateTo Конец диапазона
* @return Список сообщений * @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; package org.sadtech.social.core.repository.impl.jpa;
import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.social.core.domain.money.Account; import org.sadtech.social.core.domain.money.Account;
import org.sadtech.social.core.repository.AccountRepository; import org.sadtech.social.core.repository.AccountRepository;
import org.sadtech.social.core.repository.jpa.AccountRepositoryJpa; import org.sadtech.social.core.repository.jpa.AccountRepositoryJpa;
import java.util.Optional;
/** /**
* TODO: Добавить описание класса.
*
* @author upagge [27/07/2019] * @author upagge [27/07/2019]
*/ */
@RequiredArgsConstructor @RequiredArgsConstructor
@ -16,18 +17,18 @@ public class AccountRepositoryJpaImpl implements AccountRepository {
private final AccountRepositoryJpa accountRepositoryJpa; private final AccountRepositoryJpa accountRepositoryJpa;
@Override @Override
public Integer add(Account account) { public Account save(@NonNull Account account) {
return accountRepositoryJpa.saveAndFlush(account).getId(); return accountRepositoryJpa.save(account);
} }
@Override @Override
public void edit(Integer accountId, Account account) { public Optional<Account> findById(@NonNull Integer accountId) {
account.setId(accountId); return accountRepositoryJpa.findById(accountId);
accountRepositoryJpa.saveAndFlush(account);
} }
@Override @Override
public Account findById(Integer accountId) { public boolean existsById(Integer id) {
return accountRepositoryJpa.getOne(accountId); return accountRepositoryJpa.existsById(id);
} }
} }

View File

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

View File

@ -1,9 +1,7 @@
package org.sadtech.social.core.repository.impl.local; package org.sadtech.social.core.repository.impl.local;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account; 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 org.sadtech.social.core.repository.AccountRepository;
import java.util.HashMap; import java.util.HashMap;
@ -13,36 +11,25 @@ import java.util.Optional;
public class AccountRepositoryMap implements AccountRepository { public class AccountRepositoryMap implements AccountRepository {
private final Map<Integer, Account> saveMap = new HashMap<>(); private final Map<Integer, Account> saveMap = new HashMap<>();
private Integer id = 1; private int id = 1;
@Override @Override
public Integer add(Account account) { public Account save(@NonNull Account account) {
if (check(account.getId())) { if (existsById(account.getId())) {
account.setId(id); account.setId(id);
saveMap.put(id, account); return saveMap.put(id++, account);
return id++;
} else { } else {
throw new AccessException("Счет " + account.getId() + " уже существует"); return saveMap.put(id, account);
}
}
@Override
public void edit(Integer accountId, Account account) {
if (check(id)) {
account.setId(accountId);
saveMap.put(accountId, account);
} else {
throw new NotFoundException("Счет " + accountId + " не найден");
} }
} }
@Override @Override
public Account findById(Integer accountId) { public Optional<Account> findById(@NonNull Integer accountId) {
return Optional.ofNullable(saveMap.get(accountId)).orElseThrow(() -> new PaymentException("Счет " + accountId + " не найден")); return Optional.ofNullable(saveMap.get(accountId));
} }
private boolean check(Integer id) { public boolean existsById(Integer id) {
return !saveMap.containsKey(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; package org.sadtech.social.core.repository.impl.local;
import lombok.NonNull;
import lombok.extern.slf4j.Slf4j; import lombok.extern.slf4j.Slf4j;
import org.sadtech.social.core.domain.content.Mail; import org.sadtech.social.core.domain.content.Mail;
import org.sadtech.social.core.repository.ContentRepository; import org.sadtech.social.core.repository.ContentRepository;
@ -27,13 +28,13 @@ public class MailRepositoryList implements ContentRepository<Mail> {
} }
@Override @Override
public List<Mail> betweenByCreateDateTime(LocalDateTime from, LocalDateTime to) { public List<Mail> betweenByCreateDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
ArrayList<Mail> rezultMails = new ArrayList<>(); ArrayList<Mail> rezultMails = new ArrayList<>();
for (int i = mails.size() - 1; i >= 0; i--) { for (int i = mails.size() - 1; i >= 0; i--) {
Mail mail = mails.get(i); Mail mail = mails.get(i);
if (isTimePeriod(from, to, mail.getAddDate())) { if (isTimePeriod(dateFrom, dateTo, mail.getAddDate())) {
rezultMails.add(mail); rezultMails.add(mail);
} else if (mail.getCreateDate().isBefore(from)) { } else if (mail.getCreateDate().isBefore(dateFrom)) {
break; break;
} }
} }
@ -41,22 +42,22 @@ public class MailRepositoryList implements ContentRepository<Mail> {
} }
@Override @Override
public List<Mail> betweenByAddDateTime(LocalDateTime from, LocalDateTime to) { public List<Mail> betweenByAddDateTime(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo) {
ArrayList<Mail> rezultMails = new ArrayList<>(); ArrayList<Mail> rezultMails = new ArrayList<>();
for (int i = mails.size() - 1; i >= 0; i--) { for (int i = mails.size() - 1; i >= 0; i--) {
Mail mail = mails.get(i); Mail mail = mails.get(i);
LocalDateTime addDate = mail.getAddDate(); LocalDateTime addDate = mail.getAddDate();
if (isTimePeriod(from, to, addDate)) { if (isTimePeriod(dateFrom, dateTo, addDate)) {
rezultMails.add(mail); rezultMails.add(mail);
} else if (addDate.isBefore(from)) { } else if (addDate.isBefore(dateFrom)) {
break; break;
} }
} }
return rezultMails; return rezultMails;
} }
private boolean isTimePeriod(LocalDateTime from, LocalDateTime to, LocalDateTime dateTime) { private boolean isTimePeriod(@NonNull LocalDateTime dateFrom, @NonNull LocalDateTime dateTo, @NonNull LocalDateTime dateTime) {
return from.isBefore(dateTime) && to.isAfter(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; import org.springframework.stereotype.Repository;
/** /**
* TODO: Добавить описание интерфейса.
*
* @author upagge [27/07/2019] * @author upagge [27/07/2019]
*/ */
@Repository @Repository

View File

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

View File

@ -1,5 +1,6 @@
package org.sadtech.social.core.service; package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.money.Account; import org.sadtech.social.core.domain.money.Account;
/** /**
@ -9,7 +10,7 @@ import org.sadtech.social.core.domain.money.Account;
*/ */
public interface AccountService { public interface AccountService {
Integer add(Account account); Account add(@NonNull Account account);
/** /**
* Метод для оплаты счета * Метод для оплаты счета
@ -19,7 +20,7 @@ public interface AccountService {
* @param sum Сумма оплаты * @param sum Сумма оплаты
* @return true - в случае успешной оплаты * @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 Идентификатор счета * @param accountId Идентификатор счета
* @return true - если счет оплачен * @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; package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message; import org.sadtech.social.core.domain.content.Message;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.List; import java.util.List;
/** /**
* Интерфейс взаимодйствия с наследниками текстовых запросов пользователей. * Интерфейс взаимодйствия с наследниками текстовых сообщений пользователей.
* *
* @author upagge [08/07/2019] * @author upagge [08/07/2019]
*/ */
public interface MessageService<T extends Message> { 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 Конец интервала * @param timeTo Конец интервала
* @return Список сообщений * @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 Конец интервала * @param timeTo Конец интервала
* @return Список сообщений * @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; package org.sadtech.social.core.service;
import lombok.NonNull;
import org.sadtech.social.core.domain.content.Message; import org.sadtech.social.core.domain.content.Message;
/** /**
@ -11,6 +12,6 @@ import org.sadtech.social.core.domain.content.Message;
@FunctionalInterface @FunctionalInterface
public interface Modifiable<T extends Message> { 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; package org.sadtech.social.core.service.impl;
import lombok.NonNull;
import lombok.RequiredArgsConstructor; import lombok.RequiredArgsConstructor;
import org.sadtech.social.core.domain.money.Account; import org.sadtech.social.core.domain.money.Account;
import org.sadtech.social.core.domain.money.AccountStatus; 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.exception.PaymentException;
import org.sadtech.social.core.repository.AccountRepository; import org.sadtech.social.core.repository.AccountRepository;
import org.sadtech.social.core.service.AccountService; import org.sadtech.social.core.service.AccountService;
@ -13,22 +16,27 @@ public class AccountServiceImpl implements AccountService {
private final AccountRepository accountRepository; private final AccountRepository accountRepository;
@Override @Override
public Integer add(Account account) { public Account add(@NonNull Account account) {
account.setAccountStatus(AccountStatus.EXPOSED); if (accountRepository.existsById(account.getId())) {
return accountRepository.add(account); account.setAccountStatus(AccountStatus.EXPOSED);
return accountRepository.save(account);
} else {
throw new AccessException("Счет " + account.getId() + " уже присутствует в базе");
}
} }
@Override @Override
public Boolean pay(Integer accountId, Integer extinguishedPersonId, Integer sum) { public boolean pay(@NonNull Integer accountId, @NonNull Integer extinguishedPersonId, @NonNull Integer sum) {
Account account = accountRepository.findById(accountId); Account account = accountRepository.findById(accountId)
.orElseThrow(() -> new NotFoundException("Счет " + accountId + " не найден"));
if (validStatus(account.getAccountStatus())) { if (validStatus(account.getAccountStatus())) {
if (account.getTotalSum().equals(sum)) { if (account.getTotalSum().equals(sum)) {
account.setAccountStatus(AccountStatus.CLOSED); account.setAccountStatus(AccountStatus.CLOSED);
account.setExtinguishedPersonId(extinguishedPersonId); account.setExtinguishedPersonId(extinguishedPersonId);
accountRepository.edit(accountId, account); accountRepository.save(account);
} else { } else {
account.setAccountStatus(AccountStatus.EXCEPTION); account.setAccountStatus(AccountStatus.EXCEPTION);
accountRepository.edit(accountId, account); accountRepository.save(account);
throw new PaymentException("Неверная сумма"); throw new PaymentException("Неверная сумма");
} }
} else { } else {
@ -37,12 +45,17 @@ public class AccountServiceImpl implements AccountService {
return true; return true;
} }
private boolean validStatus(AccountStatus accountStatus) { private boolean validStatus(@NonNull AccountStatus accountStatus) {
return AccountStatus.EXCEPTION.equals(accountStatus) || AccountStatus.EXPOSED.equals(accountStatus); return AccountStatus.EXCEPTION.equals(accountStatus) || AccountStatus.EXPOSED.equals(accountStatus);
} }
@Override @Override
public Boolean paymentVerification(Integer accountId) { public boolean paymentVerification(@NonNull Integer accountId) {
return AccountStatus.CLOSED.equals(accountRepository.findById(accountId).getAccountStatus()); 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 lombok.extern.slf4j.Slf4j;
import org.sadtech.social.core.domain.content.BoardComment; import org.sadtech.social.core.domain.content.BoardComment;
import org.sadtech.social.core.repository.ContentRepository; 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.time.LocalDateTime;
import java.util.ArrayList; import java.util.ArrayList;
@ -14,7 +14,7 @@ import java.util.Set;
@Slf4j @Slf4j
@RequiredArgsConstructor @RequiredArgsConstructor
public class BoardCommentServiceImpl implements BoardCommentService { public class BoardCommentServiceImpl implements MessageService<BoardComment> {
private final ContentRepository<BoardComment> commentRepository; private final ContentRepository<BoardComment> commentRepository;
@ -25,26 +25,26 @@ public class BoardCommentServiceImpl implements BoardCommentService {
@Override @Override
public List<BoardComment> getByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) { public List<BoardComment> getByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
return null; throw new IllegalStateException("Не реализовано");
} }
@Override @Override
public List<BoardComment> getLastEventByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) { public List<BoardComment> getLastEventByCreateDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.info("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo); log.trace("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
List<BoardComment> mails = commentRepository.betweenByCreateDateTime(timeFrom, timeTo); List<BoardComment> mails = commentRepository.betweenByCreateDateTime(timeFrom, timeTo);
return getBoardComments(mails); return getBoardComments(mails);
} }
@Override @Override
public List<BoardComment> getLastEventByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) { public List<BoardComment> getLastEventByAddDateTime(LocalDateTime timeFrom, LocalDateTime timeTo) {
log.info("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo); log.trace("Запрошены последние комментарии к обсуждению {} - {} ", timeFrom, timeTo);
List<BoardComment> mails = commentRepository.betweenByAddDateTime(timeFrom, timeTo); List<BoardComment> mails = commentRepository.betweenByAddDateTime(timeFrom, timeTo);
return getBoardComments(mails); return getBoardComments(mails);
} }
@Override @Override
public List<BoardComment> getNewMessage() { public List<BoardComment> getNewMessage() {
return null; throw new IllegalStateException("Не реализовано");
} }
private List<BoardComment> getBoardComments(List<BoardComment> mails) { private List<BoardComment> getBoardComments(List<BoardComment> mails) {

View File

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

View File

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

View File

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

View File

@ -1,11 +1,11 @@
package org.sadtech.social.core.utils; package org.sadtech.social.core.utils;
import lombok.NonNull;
import java.util.List; import java.util.List;
import java.util.regex.Matcher; import java.util.regex.Matcher;
import java.util.regex.Pattern; 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 static final Pattern pattern = Pattern.compile("\\{(\\d+)}");
private InsertWords() { private InsertWords() {
throw new IllegalStateException(UTILITY_CLASS); throw new IllegalStateException(ExceptionMessages.UTILITY_CLASS);
} }
/** /**
@ -26,7 +26,7 @@ public class InsertWords {
* @param words Список слов, которые необходимо поместить вместо шаблона * @param words Список слов, которые необходимо поместить вместо шаблона
* @return Модифицированная строка * @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); Matcher m = pattern.matcher(text);
StringBuffer result = new StringBuffer(); StringBuffer result = new StringBuffer();
while (m.find()) { while (m.find()) {
@ -39,6 +39,7 @@ public class InsertWords {
m.appendTail(result); m.appendTail(result);
return result.toString(); 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.EmptyMessage;
import org.sadtech.social.core.domain.content.Message; import org.sadtech.social.core.domain.content.Message;
import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
/** /**
* Класс для хранения объекта заглушки для {@link Message}. * Класс для хранения объекта заглушки для {@link Message}.
* *
@ -12,11 +10,10 @@ import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
*/ */
public class MessageUtils { public class MessageUtils {
private MessageUtils() {
throw new IllegalStateException(UTILITY_CLASS);
}
public static final EmptyMessage EMPTY_MESSAGE = new EmptyMessage(); 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; import static org.sadtech.social.core.utils.ExceptionMessages.UTILITY_CLASS;
/**
* Используется для отправки сообщений определенного типа.
*
* @author upagge
*/
public class Sender { public class Sender {
private Sender() { private Sender() {