diff --git a/README.md b/README.md index f00c18a..5eed7a1 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -https://212.8.234.87:8443 demo +https://193.110.3.124:8443 demo Developer mode diff --git a/deploy/gdccloud/deploy.sh b/deploy/gdccloud/deploy.sh index 54b8571..5429a76 100644 --- a/deploy/gdccloud/deploy.sh +++ b/deploy/gdccloud/deploy.sh @@ -1,6 +1,6 @@ #!/bin/bash -USERSERVER="root@212.8.234.87" +USERSERVER="root@193.110.3.124" ARTIFACT_NAME="ng-tracker" PROCESS_NAME="java -jar $ARTIFACT_NAME" @@ -18,6 +18,6 @@ fi ssh $USERSERVER "cd /tmp && rm -rf $ARTIFACT_NAME*.jar && echo `date` 'killed' >> log_$ARTIFACT_NAME" scp build/libs/$ARTIFACT_NAME-0.1.0-SNAPSHOT.jar $USERSERVER:/tmp/$ARTIFACT_NAME-0.1.0-SNAPSHOT.jar -ssh $USERSERVER -f "cd /tmp/ && /opt/jdk1.8.0_144/bin/java -jar $ARTIFACT_NAME-0.1.0-SNAPSHOT.jar -Xms 512m -Xmx 1024m --server.port=8443 --server.http.port=8080 >> /home/user/logfile_$ARTIFACT_NAME" & +ssh $USERSERVER -f "cd /tmp/ && /opt/jdk1.8.0_192/bin/java -jar $ARTIFACT_NAME-0.1.0-SNAPSHOT.jar -Xms 512m -Xmx 1024m --server.port=8443 --server.http.port=8080 >> /home/user/logfile_$ARTIFACT_NAME" & sleep 10 echo "is deployed" \ No newline at end of file diff --git a/src/main/java/ru/ulstu/configuration/ApplicationProperties.java b/src/main/java/ru/ulstu/configuration/ApplicationProperties.java index b89641a..8615cb2 100644 --- a/src/main/java/ru/ulstu/configuration/ApplicationProperties.java +++ b/src/main/java/ru/ulstu/configuration/ApplicationProperties.java @@ -15,6 +15,16 @@ public class ApplicationProperties { private String undeadUserLogin; private boolean devMode; + private boolean useHttps; + + public boolean isUseHttps() { + return useHttps; + } + + public void setUseHttps(boolean useHttps) { + this.useHttps = useHttps; + } + public String getBaseUrl() { return baseUrl; } diff --git a/src/main/java/ru/ulstu/configuration/ControllersConfiguration.java b/src/main/java/ru/ulstu/configuration/ControllersConfiguration.java index 2d92313..a2beab7 100644 --- a/src/main/java/ru/ulstu/configuration/ControllersConfiguration.java +++ b/src/main/java/ru/ulstu/configuration/ControllersConfiguration.java @@ -17,6 +17,8 @@ class ControllersConfiguration { config.addAllowedHeader("*"); config.addAllowedMethod("GET"); config.addAllowedMethod("POST"); + config.addAllowedMethod("PUT"); + config.addAllowedMethod("OPTIONAL"); config.addAllowedMethod("DELETE"); source.registerCorsConfiguration("/**", config); return new CorsFilter(source); diff --git a/src/main/java/ru/ulstu/configuration/SecurityConfiguration.java b/src/main/java/ru/ulstu/configuration/SecurityConfiguration.java index c0f34d6..da498fa 100644 --- a/src/main/java/ru/ulstu/configuration/SecurityConfiguration.java +++ b/src/main/java/ru/ulstu/configuration/SecurityConfiguration.java @@ -86,13 +86,16 @@ public class SecurityConfiguration extends WebSecurityConfigurerAdapter { .deleteCookies(Constants.COOKIES_NAME) .permitAll(); } - http.portMapper() - .http(httpPort) - .mapsTo(httpsPort) - .and() - .requiresChannel() - .anyRequest() - .requiresSecure(); + if (applicationProperties.isUseHttps()) { + http.portMapper() + .http(httpPort) + .mapsTo(httpsPort) + .and() + .requiresChannel() + .anyRequest() + .requiresSecure(); + } + } @Override diff --git a/src/main/java/ru/ulstu/core/model/UserContainer.java b/src/main/java/ru/ulstu/core/model/UserContainer.java new file mode 100644 index 0000000..7f83cd3 --- /dev/null +++ b/src/main/java/ru/ulstu/core/model/UserContainer.java @@ -0,0 +1,9 @@ +package ru.ulstu.core.model; + +import ru.ulstu.user.model.User; + +import java.util.Set; + +public interface UserContainer { + Set getUsers(); +} diff --git a/src/main/java/ru/ulstu/core/util/DateUtils.java b/src/main/java/ru/ulstu/core/util/DateUtils.java index a8853b4..b24b09c 100644 --- a/src/main/java/ru/ulstu/core/util/DateUtils.java +++ b/src/main/java/ru/ulstu/core/util/DateUtils.java @@ -43,4 +43,10 @@ public class DateUtils { public static Date localTimeToDate(LocalTime localTime) { return Date.from(localTime.atDate(LocalDate.now()).atZone(ZoneId.systemDefault()).toInstant()); } + + public static Date addDays(Date date, int count) { + Calendar cal = getCalendar(date); + cal.add(Calendar.DAY_OF_MONTH, count); + return cal.getTime(); + } } diff --git a/src/main/java/ru/ulstu/core/util/StreamApiUtils.java b/src/main/java/ru/ulstu/core/util/StreamApiUtils.java index e1fb55a..ab8d66f 100644 --- a/src/main/java/ru/ulstu/core/util/StreamApiUtils.java +++ b/src/main/java/ru/ulstu/core/util/StreamApiUtils.java @@ -2,6 +2,7 @@ package ru.ulstu.core.util; import java.util.Collections; import java.util.List; +import java.util.Set; import java.util.function.Function; import java.util.stream.Collectors; @@ -9,7 +10,13 @@ public class StreamApiUtils { public static List convert(List entities, Function converter) { return entities == null - ? Collections.EMPTY_LIST + ? Collections.emptyList() : entities.stream().map(e -> converter.apply(e)).collect(Collectors.toList()); } + + public static Set convert(Set entities, Function converter) { + return entities == null + ? Collections.emptySet() + : entities.stream().map(e -> converter.apply(e)).collect(Collectors.toSet()); + } } diff --git a/src/main/java/ru/ulstu/paper/controller/PaperController.java b/src/main/java/ru/ulstu/paper/controller/PaperController.java index 0672f82..e5acd23 100644 --- a/src/main/java/ru/ulstu/paper/controller/PaperController.java +++ b/src/main/java/ru/ulstu/paper/controller/PaperController.java @@ -14,6 +14,7 @@ import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.model.PaperStatusDto; import ru.ulstu.paper.service.PaperService; +import javax.validation.Valid; import java.io.IOException; import java.util.List; @@ -32,16 +33,16 @@ public class PaperController { @GetMapping public Response> getPapers() { - return new Response<>(paperService.findAll()); + return new Response<>(paperService.findAllDto()); } @PostMapping - public Response createPaper(@RequestBody PaperDto paperDto) throws IOException { + public Response createPaper(@RequestBody @Valid PaperDto paperDto) throws IOException { return new Response(paperService.create(paperDto)); } @PutMapping - public Response updatePaper(@RequestBody PaperDto paperDto) throws IOException { + public Response updatePaper(@RequestBody @Valid PaperDto paperDto) throws IOException { return new Response(paperService.update(paperDto)); } diff --git a/src/main/java/ru/ulstu/paper/model/Paper.java b/src/main/java/ru/ulstu/paper/model/Paper.java index 77b8e0c..e9cc92c 100644 --- a/src/main/java/ru/ulstu/paper/model/Paper.java +++ b/src/main/java/ru/ulstu/paper/model/Paper.java @@ -2,15 +2,26 @@ package ru.ulstu.paper.model; import org.hibernate.validator.constraints.NotBlank; import ru.ulstu.core.model.BaseEntity; +import ru.ulstu.core.model.UserContainer; import ru.ulstu.file.model.FileData; import ru.ulstu.user.model.User; -import javax.persistence.*; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.EnumType; +import javax.persistence.Enumerated; +import javax.persistence.FetchType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToMany; +import javax.persistence.ManyToOne; +import javax.validation.constraints.NotNull; import java.util.Date; +import java.util.HashSet; import java.util.List; +import java.util.Set; @Entity -public class Paper extends BaseEntity { +public class Paper extends BaseEntity implements UserContainer { public enum PaperStatus { ATTENTION("Обратить внимание"), ON_PREPARATION("На подготовке"), DRAFT("Черновик"), COMPLETED("Завершена"); @@ -29,27 +40,28 @@ public class Paper extends BaseEntity { private String title; @Enumerated(value = EnumType.STRING) - private PaperStatus status; + private PaperStatus status = PaperStatus.DRAFT; @Column(name = "create_date") - private Date createDate; + private Date createDate = new Date(); @Column(name = "update_date") - private Date updateDate; + private Date updateDate = new Date(); @Column(name = "deadline_date") + @NotNull private Date deadlineDate; private String comment; - private Boolean locked; + private Boolean locked = false; @ManyToOne @JoinColumn(name = "file_id") private FileData fileData; - @ManyToMany - private List authors; + @ManyToMany(fetch = FetchType.EAGER) + private Set authors = new HashSet<>(); public PaperStatus getStatus() { return status; @@ -115,11 +127,16 @@ public class Paper extends BaseEntity { this.title = title; } - public List getAuthors() { + public Set getAuthors() { return authors; } - public void setAuthors(List authors) { + public void setAuthors(Set authors) { this.authors = authors; } + + @Override + public Set getUsers() { + return getAuthors(); + } } diff --git a/src/main/java/ru/ulstu/paper/model/PaperDto.java b/src/main/java/ru/ulstu/paper/model/PaperDto.java index aeb4e3f..dc48fcd 100644 --- a/src/main/java/ru/ulstu/paper/model/PaperDto.java +++ b/src/main/java/ru/ulstu/paper/model/PaperDto.java @@ -2,19 +2,23 @@ package ru.ulstu.paper.model; import com.fasterxml.jackson.annotation.JsonCreator; import com.fasterxml.jackson.annotation.JsonProperty; +import org.hibernate.validator.constraints.NotEmpty; import ru.ulstu.user.model.UserDto; +import javax.validation.constraints.NotNull; import java.util.Date; -import java.util.List; +import java.util.Set; import static ru.ulstu.core.util.StreamApiUtils.convert; public class PaperDto { private final Integer id; + @NotEmpty private final String title; private final Paper.PaperStatus status; private final Date createDate; private final Date updateDate; + @NotNull private final Date deadlineDate; private final String comment; private final Boolean locked; @@ -22,7 +26,7 @@ public class PaperDto { private final Integer fileId; private final String fileName; private final Date fileCreateDate; - private final List authors; + private final Set authors; @JsonCreator public PaperDto(@JsonProperty("id") Integer id, @@ -34,7 +38,7 @@ public class PaperDto { @JsonProperty("comment") String comment, @JsonProperty("locked") Boolean locked, @JsonProperty("tmpFileName") String tmpFileName, - @JsonProperty("authors") List authors) { + @JsonProperty("authors") Set authors) { this.id = id; this.title = title; this.status = status; @@ -86,7 +90,9 @@ public class PaperDto { return updateDate; } - public Date getDeadlineDate() {return deadlineDate;} + public Date getDeadlineDate() { + return deadlineDate; + } public String getComment() { return comment; @@ -112,7 +118,7 @@ public class PaperDto { return fileCreateDate; } - public List getAuthors() { + public Set getAuthors() { return authors; } } diff --git a/src/main/java/ru/ulstu/paper/service/DeadlineScheduler.java b/src/main/java/ru/ulstu/paper/service/DeadlineScheduler.java index da1f2bf..d6d9852 100644 --- a/src/main/java/ru/ulstu/paper/service/DeadlineScheduler.java +++ b/src/main/java/ru/ulstu/paper/service/DeadlineScheduler.java @@ -4,62 +4,34 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Service; -import ru.ulstu.paper.model.Paper; -import ru.ulstu.paper.repository.PaperRepository; -import ru.ulstu.user.model.User; -import ru.ulstu.user.scheduler.UserScheduler; -import ru.ulstu.user.service.MailService; - -import java.util.Calendar; -import java.util.List; @Service public class DeadlineScheduler { + private final static boolean IS_DEADLINE_NOTIFICATION_BEFORE_WEEK = true; private final Logger log = LoggerFactory.getLogger(DeadlineScheduler.class); - private final PaperRepository paperRepository; - - private final MailService mailService; - - private final static boolean IS_DEADLINE_NOTIFICATION_BEFORE_WEEK = true; + private final PaperNotificationService paperNotificationService; + private final PaperService paperService; - public DeadlineScheduler(PaperRepository paperRepository, MailService mailService) { - this.paperRepository = paperRepository; - this.mailService = mailService; + public DeadlineScheduler(PaperNotificationService paperNotificationService, + PaperService paperService) { + this.paperNotificationService = paperNotificationService; + this.paperService = paperService; } @Scheduled(cron = "0 0 8 * 1 ?") public void checkDeadlineBeforeWeek() { log.debug("DeadlineScheduler.checkDeadlineBeforeWeek started"); - sendNotifications(IS_DEADLINE_NOTIFICATION_BEFORE_WEEK); + paperNotificationService.sendDeadlineNotifications(paperService.findAll(), !IS_DEADLINE_NOTIFICATION_BEFORE_WEEK); log.debug("DeadlineScheduler.checkDeadlineBeforeWeek finished"); } @Scheduled(cron = "0 0 8 * * ?") public void checkDeadlineAfterWeek() { log.debug("DeadlineScheduler.checkDeadlineAfterWeek started"); - sendNotifications(!IS_DEADLINE_NOTIFICATION_BEFORE_WEEK); + paperNotificationService.sendDeadlineNotifications(paperService.findAll(), IS_DEADLINE_NOTIFICATION_BEFORE_WEEK); log.debug("DeadlineScheduler.checkDeadlineAfterWeek finished"); } - - private void sendNotifications(boolean isDeadlineBeforeWeek) { - List allPapers = paperRepository.findAll(); - for (Paper paper : allPapers) { - Calendar c = Calendar.getInstance(); - c.add(Calendar.DAY_OF_YEAR, 7); - if (((c.getTime().compareTo(paper.getDeadlineDate()) < 0) && isDeadlineBeforeWeek) || - (c.getTime().compareTo(paper.getDeadlineDate()) >= 0) && !isDeadlineBeforeWeek) { - sendMessageDeadline(paper); - } - } - } - - private void sendMessageDeadline(Paper paper){ - for (User user : paper.getAuthors()) { - mailService.sendEmail(user.getEmail(), "Приближается срок сдачи статьи", - "Срок сдачи статьи " + paper.getTitle() + " " + paper.getDeadlineDate().toString()); - } - } } diff --git a/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java new file mode 100644 index 0000000..736ae87 --- /dev/null +++ b/src/main/java/ru/ulstu/paper/service/PaperNotificationService.java @@ -0,0 +1,57 @@ +package ru.ulstu.paper.service; + +import com.google.common.collect.ImmutableMap; +import org.springframework.stereotype.Service; +import ru.ulstu.core.util.DateUtils; +import ru.ulstu.paper.model.Paper; +import ru.ulstu.user.service.MailService; + +import java.util.Date; +import java.util.List; +import java.util.Map; + +@Service +public class PaperNotificationService { + private final static int DAYS_TO_DEADLINE_NOTIFICATION = 7; + + private final MailService mailService; + + public PaperNotificationService(MailService mailService) { + this.mailService = mailService; + } + + public void sendDeadlineNotifications(List papers, boolean isDeadlineBeforeWeek) { + Date now = DateUtils.addDays(new Date(), DAYS_TO_DEADLINE_NOTIFICATION); + papers + .stream() + .filter(paper -> needToSendDeadlineNotification(paper, now, isDeadlineBeforeWeek)) + .forEach(paper -> sendMessageDeadline(paper)); + } + + private boolean needToSendDeadlineNotification(Paper paper, Date compareDate, boolean isDeadlineBeforeWeek) { + return (paper.getDeadlineDate() != null) + && (compareDate.after(paper.getDeadlineDate()) && isDeadlineBeforeWeek + || compareDate.before(paper.getDeadlineDate()) && !isDeadlineBeforeWeek); + } + + private void sendMessageDeadline(Paper paper) { + paper.getAuthors().forEach(user -> { + mailService.sendEmail(user.getEmail(), "Приближается срок сдачи статьи", + "Срок сдачи статьи " + paper.getTitle() + " " + paper.getDeadlineDate().toString()); + }); + } + + public void sendCreateNotification(Paper paper) { + Map variables = ImmutableMap.of("paper", paper); + paper.getAuthors().forEach(author -> { + mailService.sendEmailFromTemplate(variables, author, "paperCreateNotification", "Создана статья"); + }); + } + + public void statusChangeNotification(Paper paper, Paper.PaperStatus oldStatus) { + Map variables = ImmutableMap.of("paper", paper, "oldStatus", oldStatus); + paper.getAuthors().forEach(author -> { + mailService.sendEmailFromTemplate(variables, author, "paperStatusChangeNotification", "Изменился статус статьи"); + }); + } +} diff --git a/src/main/java/ru/ulstu/paper/service/PaperService.java b/src/main/java/ru/ulstu/paper/service/PaperService.java index 4498b32..a5b5237 100644 --- a/src/main/java/ru/ulstu/paper/service/PaperService.java +++ b/src/main/java/ru/ulstu/paper/service/PaperService.java @@ -7,11 +7,12 @@ import ru.ulstu.paper.model.Paper; import ru.ulstu.paper.model.PaperDto; import ru.ulstu.paper.model.PaperStatusDto; import ru.ulstu.paper.repository.PaperRepository; -import ru.ulstu.user.model.UserDto; -import ru.ulstu.user.service.MailService; +import ru.ulstu.user.model.User; +import ru.ulstu.user.service.UserService; import java.io.IOException; import java.util.Arrays; +import java.util.Date; import java.util.List; import java.util.stream.Collectors; @@ -19,22 +20,24 @@ import static ru.ulstu.core.util.StreamApiUtils.convert; @Service public class PaperService { - + private final PaperNotificationService paperNotificationService; private final PaperRepository paperRepository; + private final UserService userService; private final FileService fileService; - public final MailService mailService; public PaperService(PaperRepository paperRepository, - FileService fileService, MailService mailService) { + FileService fileService, + PaperNotificationService paperNotificationService, + UserService userService) { this.paperRepository = paperRepository; this.fileService = fileService; - this.mailService = mailService; + this.paperNotificationService = paperNotificationService; + this.userService = userService; } - public List findAll() { - List allPapers = paperRepository.findAll(); - allPapers = allPapers.stream().sorted((paper1, paper2) -> { + public List findAll() { + return paperRepository.findAll().stream().sorted((paper1, paper2) -> { int statusCompareResult = Integer.valueOf(Arrays.asList(Paper.PaperStatus.values()).indexOf(paper1.getStatus())) .compareTo(Integer.valueOf(Arrays.asList(Paper.PaperStatus.values()).indexOf(paper2.getStatus()))); @@ -43,37 +46,53 @@ public class PaperService { } return paper1.getTitle().compareTo(paper2.getTitle()); }).collect(Collectors.toList()); - return convert(allPapers, PaperDto::new); + } + + public List findAllDto() { + return convert(findAll(), PaperDto::new); } @Transactional public int create(PaperDto paperDto) throws IOException { - return paperRepository.save(copyFromDto(new Paper(), paperDto)).getId(); + Paper newPaper = copyFromDto(new Paper(), paperDto); + newPaper = paperRepository.save(newPaper); + paperNotificationService.sendCreateNotification(newPaper); + return newPaper.getId(); } private Paper copyFromDto(Paper paper, PaperDto paperDto) throws IOException { paper.setComment(paperDto.getComment()); - paper.setCreateDate(paperDto.getCreateDate()); + paper.setCreateDate(paper.getCreateDate() == null ? new Date() : paper.getCreateDate()); paper.setLocked(paperDto.getLocked()); - paper.setStatus(paperDto.getStatus()); + paper.setStatus(paperDto.getStatus() == null ? Paper.PaperStatus.DRAFT : paperDto.getStatus()); paper.setTitle(paperDto.getTitle()); - paper.setUpdateDate(paperDto.getUpdateDate()); + paper.setUpdateDate(new Date()); + paper.setDeadlineDate(paperDto.getDeadlineDate()); if (paperDto.getTmpFileName() != null) { paper.setFileData(fileService.createFileFromTmp(paperDto.getTmpFileName())); } + if (paperDto.getAuthors() != null && !paperDto.getAuthors().isEmpty()) { + paperDto.getAuthors().forEach(authorIds -> { + paper.getAuthors().add(userService.findById(authorIds.getId())); + }); + } return paper; } @Transactional public Integer update(PaperDto paperDto) throws IOException { Paper paper = paperRepository.findOne(paperDto.getId()); - if(paper != null && paper.getStatus() != paperDto.getStatus()){ - sendMessageAboutStatusChange(paper.getStatus(),paperDto); - } + Paper.PaperStatus oldStatus = paper.getStatus(); if (paperDto.getTmpFileName() != null && paper.getFileData() != null) { fileService.deleteFile(paper.getFileData()); } - return paperRepository.save(copyFromDto(paper, paperDto)).getId(); + paperRepository.save(copyFromDto(paper, paperDto)); + + if (paper.getStatus() != oldStatus) { + paperNotificationService.statusChangeNotification(paper, oldStatus); + } + + return paper.getId(); } @Transactional @@ -86,14 +105,22 @@ public class PaperService { } public List getPaperStatuses() { - return convert(Arrays.asList(Paper.PaperStatus.values()), status ->new PaperStatusDto(status)); + return convert(Arrays.asList(Paper.PaperStatus.values()), status -> new PaperStatusDto(status)); } - private void sendMessageAboutStatusChange(Paper.PaperStatus oldStatus, PaperDto paper){ - for (UserDto user: paper.getAuthors()) { - mailService.sendEmail(user.getEmail(), "Обновление статуса статьи", - "Статус статьи " + paper.getTitle() + " сменился с " + oldStatus.getName() - + " на " + paper.getStatus().getName()); - } + @Transactional + public Paper create(String title, User user, Date deadlineDate) { + Paper paper = new Paper(); + paper.setTitle(title); + paper.getAuthors().add(user); + paper.setDeadlineDate(deadlineDate); + paper.setCreateDate(new Date()); + paper.setUpdateDate(new Date()); + paper.setStatus(Paper.PaperStatus.DRAFT); + paper = paperRepository.save(paper); + + paperNotificationService.sendCreateNotification(paper); + + return paper; } } diff --git a/src/main/java/ru/ulstu/strategy/api/EntityCreateStrategy.java b/src/main/java/ru/ulstu/strategy/api/EntityCreateStrategy.java new file mode 100644 index 0000000..8449e10 --- /dev/null +++ b/src/main/java/ru/ulstu/strategy/api/EntityCreateStrategy.java @@ -0,0 +1,28 @@ +package ru.ulstu.strategy.api; + +import ru.ulstu.core.model.UserContainer; +import ru.ulstu.user.model.User; + +import java.util.List; +import java.util.stream.Collectors; + +public abstract class EntityCreateStrategy { + protected abstract List getActiveEntities(); + + protected abstract void createEntity(User user); + + protected void createDefaultEntityIfNeed(List allUsers, List entities) { + allUsers.forEach(user -> { + if (entities + .stream() + .filter(entity -> entity.getUsers().contains(user)) + .collect(Collectors.toSet()).isEmpty()) { + createEntity(user); + } + }); + } + + public void createEntityIfNeed(List allUsers) { + createDefaultEntityIfNeed(allUsers, getActiveEntities()); + } +} diff --git a/src/main/java/ru/ulstu/strategy/api/PaperCreateStrategy.java b/src/main/java/ru/ulstu/strategy/api/PaperCreateStrategy.java new file mode 100644 index 0000000..da457a1 --- /dev/null +++ b/src/main/java/ru/ulstu/strategy/api/PaperCreateStrategy.java @@ -0,0 +1,35 @@ +package ru.ulstu.strategy.api; + +import org.springframework.stereotype.Service; +import ru.ulstu.core.util.DateUtils; +import ru.ulstu.paper.model.Paper; +import ru.ulstu.paper.service.PaperService; +import ru.ulstu.user.model.User; +import ru.ulstu.user.service.UserService; + +import java.util.Date; +import java.util.List; + +@Service +public class PaperCreateStrategy extends EntityCreateStrategy { + private static final String DEFAULT_NAME = "Статья создана автоматически"; + private static final int DEFAULT_DEADLINE_DAYS = 14; + private final PaperService paperService; + private final UserService userService; + + public PaperCreateStrategy(PaperService paperService, + UserService userService) { + this.paperService = paperService; + this.userService = userService; + } + + @Override + protected List getActiveEntities() { + return paperService.findAll(); + } + + @Override + protected void createEntity(User user) { + paperService.create(DEFAULT_NAME, user, DateUtils.addDays(new Date(), DEFAULT_DEADLINE_DAYS)); + } +} diff --git a/src/main/java/ru/ulstu/strategy/api/StrategyEntityCreateExecutor.java b/src/main/java/ru/ulstu/strategy/api/StrategyEntityCreateExecutor.java new file mode 100644 index 0000000..c3d4d95 --- /dev/null +++ b/src/main/java/ru/ulstu/strategy/api/StrategyEntityCreateExecutor.java @@ -0,0 +1,25 @@ +package ru.ulstu.strategy.api; + +import org.springframework.scheduling.annotation.Scheduled; +import org.springframework.stereotype.Service; +import ru.ulstu.user.service.UserService; + +import java.util.List; + +@Service +public class StrategyEntityCreateExecutor { + private final List entityCreateStrategies; + private final UserService userService; + + public StrategyEntityCreateExecutor(List entityCreateStrategies, + UserService userService) { + this.entityCreateStrategies = entityCreateStrategies; + this.userService = userService; + } + + + @Scheduled(cron = "0 0 8 * * *") + public void scheduleExecuteStrategies() { + entityCreateStrategies.forEach(strategy -> strategy.createEntityIfNeed(userService.findAll())); + } +} diff --git a/src/main/java/ru/ulstu/user/service/UserService.java b/src/main/java/ru/ulstu/user/service/UserService.java index 0603620..e6fca9f 100644 --- a/src/main/java/ru/ulstu/user/service/UserService.java +++ b/src/main/java/ru/ulstu/user/service/UserService.java @@ -77,6 +77,11 @@ public class UserService implements UserDetailsService { return new PageableItems<>(page.getTotalElements(), userMapper.userEntitiesToUserListDtos(page.getContent())); } + // TODO: read only active users + public List findAll() { + return userRepository.findAll(); + } + @Transactional(readOnly = true) public PageableItems getUserRoles() { final List roles = userRoleRepository.findAll().stream() @@ -286,4 +291,8 @@ public class UserService implements UserDetailsService { public List findByIds(List ids) { return userRepository.findAll(ids); } + + public User findById(Integer id) { + return userRepository.findOne(id); + } } diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index ea20ef6..e696ccd 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -16,8 +16,8 @@ logging.level.ru.ulstu=DEBUG # Mail Settings spring.mail.host=smtp.yandex.ru spring.mail.port=465 -spring.mail.username=balance@soft.kitchen -spring.mail.password=fkvfpbalance +spring.mail.username=nio17.ulstu@yandex.ru +spring.mail.password=nio17.ulstu.ru spring.mail.properties.mail.smtp.auth=true spring.mail.properties.mail.smtp.ssl.enable=true spring.mail.properties.mail.smtp.socketFactory.class=javax.net.ssl.SSLSocketFactory @@ -34,4 +34,5 @@ liquibase.change-log=classpath:db/changelog-master.xml # Application Settings ng-tracker.base-url=https://127.0.0.1:8443 ng-tracker.undead-user-login=admin -ng-tracker.dev-mode=true \ No newline at end of file +ng-tracker.dev-mode=true +ng-tracker.use-https=false \ No newline at end of file diff --git a/src/main/resources/db/changelog-20181108_000000-data.xml b/src/main/resources/db/changelog-20181108_000000-data.xml new file mode 100644 index 0000000..834bb58 --- /dev/null +++ b/src/main/resources/db/changelog-20181108_000000-data.xml @@ -0,0 +1,11 @@ + + + + + update users + set email = 'romanov73@gmail.com' where id = 1; + + + diff --git a/src/main/resources/db/changelog-master.xml b/src/main/resources/db/changelog-master.xml index bd52f71..fe8d7d6 100644 --- a/src/main/resources/db/changelog-master.xml +++ b/src/main/resources/db/changelog-master.xml @@ -13,4 +13,5 @@ + \ No newline at end of file diff --git a/src/main/resources/mail_templates/paperCreateNotification.html b/src/main/resources/mail_templates/paperCreateNotification.html new file mode 100644 index 0000000..3e71ce9 --- /dev/null +++ b/src/main/resources/mail_templates/paperCreateNotification.html @@ -0,0 +1,24 @@ + + + + Уведомление о создании статьи + + + + +

+ Уважаемый(ая) Ivan Ivanov +

+

+ Вам нужно поработать над статьей "Title". +

+

+ Срок исполнения: . +

+

+ Regards, +
+ NG-tracker. +

+ + diff --git a/src/main/resources/mail_templates/paperDeadlineNotification.html b/src/main/resources/mail_templates/paperDeadlineNotification.html new file mode 100644 index 0000000..ee63f3b --- /dev/null +++ b/src/main/resources/mail_templates/paperDeadlineNotification.html @@ -0,0 +1,24 @@ + + + + Уведомление дедлайне статьи + + + + +

+ Уважаемый(ая) Ivan Ivanov +

+

+ Приближается срок сдачи статьи "Title". +

+

+ Срок исполнения: . +

+

+ Regards, +
+ NG-tracker. +

+ + diff --git a/src/main/resources/mail_templates/paperStatusChangeNotification.html b/src/main/resources/mail_templates/paperStatusChangeNotification.html new file mode 100644 index 0000000..15db20a --- /dev/null +++ b/src/main/resources/mail_templates/paperStatusChangeNotification.html @@ -0,0 +1,22 @@ + + + + Уведомление о смене статуса статьи + + + + +

+ Уважаемый(ая) Ivan Ivanov +

+

+ Статус статьи "Title" сменился с + "oldStatus" на "newStatus". +

+

+ Regards, +
+ NG-tracker. +

+ + diff --git a/src/main/resources/public/css/agency.css b/src/main/resources/public/css/agency.css index 25a9770..a754bc3 100644 --- a/src/main/resources/public/css/agency.css +++ b/src/main/resources/public/css/agency.css @@ -62,7 +62,7 @@ section h3.section-subheading { @media (min-width: 768px) { section { - padding: 150px 0; + padding: 100px 0; } } @@ -741,6 +741,11 @@ ul.social-buttons li a:active, ul.social-buttons li a:focus, ul.social-buttons l border-radius: 5px; box-shadow: 0 5px 20px rgba(0, 0, 0, 0.05); } + +.toolbar-button { + width: 100%; + margin: 5px; +} /* --------------------------------------------------- FEEDBACK STYLE ----------------------------------------------------- */ diff --git a/src/main/resources/public/js/core.js b/src/main/resources/public/js/core.js index 5022c96..5c9241c 100644 --- a/src/main/resources/public/js/core.js +++ b/src/main/resources/public/js/core.js @@ -1,7 +1,7 @@ // from config.js /* global urlVersions */ -var urlFileUpload = "https://localhost:8443/api/1.0/papers/uploadTmpFile"; +var urlFileUpload = "/api/1.0/papers/uploadTmpFile"; /* exported MessageTypesEnum */ var MessageTypesEnum = { diff --git a/src/main/resources/public/js/papers.js b/src/main/resources/public/js/papers.js index bab27a7..b2b81a6 100644 --- a/src/main/resources/public/js/papers.js +++ b/src/main/resources/public/js/papers.js @@ -1,5 +1,5 @@ -var urlPapers = "https://localhost:8443/api/1.0/papers"; -var urlPaperStatuses = "https://localhost:8443/api/1.0/papers/statuses"; +var urlPapers = "/api/1.0/papers"; +var urlPaperStatuses = "/api/1.0/papers/statuses"; function showPapers(papersElement) { getFromRest(urlPapers, function (paperList) { @@ -10,7 +10,7 @@ function showPapers(papersElement) { " " + " " + " " + - " " + paper.title + "" + " "); }); diff --git a/src/main/resources/templates/papers/papers.html b/src/main/resources/templates/papers/papers.html index 3a3a7cc..83cf15a 100644 --- a/src/main/resources/templates/papers/papers.html +++ b/src/main/resources/templates/papers/papers.html @@ -12,8 +12,17 @@ @@ -21,7 +30,7 @@