release-0.0.2

This commit is contained in:
uPagge 2021-01-17 21:55:28 +03:00
parent 167843d8b2
commit c0188f59ea
No known key found for this signature in database
GPG Key ID: 964B40928E4C9088
19 changed files with 121 additions and 83 deletions

View File

@ -35,4 +35,9 @@ public class SchedulerService {
noteParser.scanNewCommentAndTask(); noteParser.scanNewCommentAndTask();
} }
@Scheduled(cron = "*/30 * * * * *")
public void oldTaskParser() {
noteParser.scanOldTask();
}
} }

View File

@ -35,12 +35,13 @@ gitlab-bot:
url-project: ${GITLAB_URL}/api/v4/projects?page={0, number, integer}&per_page=100 url-project: ${GITLAB_URL}/api/v4/projects?page={0, number, integer}&per_page=100
url-pull-request-open: ${GITLAB_URL}/api/v4/projects/{0, number, integer}/merge_requests?state=opened&page={1, number, integer}&per_page=100 url-pull-request-open: ${GITLAB_URL}/api/v4/projects/{0, number, integer}/merge_requests?state=opened&page={1, number, integer}&per_page=100
url-pull-request-close: ${GITLAB_URL} url-pull-request-close: ${GITLAB_URL}
url-pull-request-comment: ${GITLAB_URL}/api/v4/projects/{0, number, integer}/merge_requests/{1}/notes url-pull-request-comment: "${GITLAB_URL}/api/v4/projects/{0,number,integer}/merge_requests/{1,number,integer}/notes?&page={2, number, integer}&per_page=100"
url-pull-request: ${GITLAB_URL}/api/v4/projects/{0, number, integer}/merge_requests/{1, number, integer}?page={2, number, integer}&per_page=100 url-pull-request: ${GITLAB_URL}/api/v4/projects/{0, number, integer}/merge_requests/{1, number, integer}?page={2, number, integer}&per_page=100
url-merge-request-add: ${GITLAB_URL}/api/v4/projects/{0}%2F{1} url-merge-request-add: ${GITLAB_URL}/api/v4/projects/{0}%2F{1}
user-url: ${GITLAB_URL}/api/v4/user user-url: ${GITLAB_URL}/api/v4/user
users-url: ${GITLAB_URL}/api/v4/users users-url: ${GITLAB_URL}/api/v4/users
url-note: "{0}#note_{1,number,#}" url-note: "{0}#note_{1,number,#}"
url-note-api: "${GITLAB_URL}/api/v4/projects/{0,number,#}/merge_requests/{1,number,#}/notes/{2,number,#}"
teamcity: teamcity:
token: ${TEAMCITY_ADMIN_TOKEN} token: ${TEAMCITY_ADMIN_TOKEN}
project-url: ${TEAMCITY_URL}/app/rest/projects project-url: ${TEAMCITY_URL}/app/rest/projects

View File

@ -156,10 +156,11 @@
<createTable tableName="merge_request_notes"> <createTable tableName="merge_request_notes">
<column name="merge_request_id" type="int"> <column name="merge_request_id" type="int">
<constraints nullable="false" foreignKeyName="merge_request_notes_merge_request_id" <constraints nullable="false" foreignKeyName="merge_request_notes_merge_request_id"
references="note(id)" deleteCascade="true"/> references="merge_request(id)" deleteCascade="true"/>
</column> </column>
<column name="notes_id" type="int"> <column name="notes_id" type="int">
<constraints nullable="false" foreignKeyName="merge_request_notes_note_id" references="note(id)"/> <constraints nullable="false" foreignKeyName="merge_request_notes_note_id" references="note(id)"
deleteCascade="true"/>
</column> </column>
</createTable> </createTable>

View File

@ -4,7 +4,7 @@ ui.lang_changed=Language changed successfully
ui.monitor_private_projects=Start tracking private projects? ui.monitor_private_projects=Start tracking private projects?
ui.monitor_project_private_success=Projects have been successfully added to tracking ui.monitor_project_private_success=Projects have been successfully added to tracking
ui.monitor_owner_projects=Start tracking public projects that you own? ui.monitor_owner_projects=Start tracking public projects that you own?
ui.setup_finished=Configuration completed successfully ui.setup_finished=Configuration completed successfully\n-- -- -- -- --\nDeveloper: [uPagge](https://uPagge.ru)
ui.menu.header=This is the bot menu, select a new item ui.menu.header=This is the bot menu, select a new item
ui.menu.task=My tasks ui.menu.task=My tasks
ui.menu.mr=Merge Request ui.menu.mr=Merge Request

View File

@ -4,7 +4,7 @@ ui.lang_changed=Язык успешно изменен
ui.monitor_private_projects=Начать отслеживать приватные проекты? ui.monitor_private_projects=Начать отслеживать приватные проекты?
ui.monitor_project_private_success=Проекты успешно добавлены в отслеживание ui.monitor_project_private_success=Проекты успешно добавлены в отслеживание
ui.monitor_owner_projects=Начать отслеживать публичные проекты, владельцем которых вы являетесь? ui.monitor_owner_projects=Начать отслеживать публичные проекты, владельцем которых вы являетесь?
ui.setup_finished=Настройка успешно завершена ui.setup_finished=Настройка успешно завершена\n-- -- -- -- --\nРазработчик: [uPagge](https://uPagge.ru)
ui.menu.header=Это меню бота, выберите новый пункт ui.menu.header=Это меню бота, выберите новый пункт
ui.menu.task=Мои задачи ui.menu.task=Мои задачи
ui.menu.mr=Merge Request ui.menu.mr=Merge Request

View File

@ -12,17 +12,12 @@ import javax.persistence.ElementCollection;
import javax.persistence.Entity; import javax.persistence.Entity;
import javax.persistence.EnumType; import javax.persistence.EnumType;
import javax.persistence.Enumerated; import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.Id; import javax.persistence.Id;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;
import javax.persistence.Table; import javax.persistence.Table;
import java.time.LocalDateTime; import java.time.LocalDateTime;
import java.util.ArrayList;
import java.util.HashSet; import java.util.HashSet;
import java.util.List;
import java.util.Set; import java.util.Set;
/** /**
@ -92,8 +87,8 @@ public class MergeRequest implements BasicEntity<Long> {
@Column(name = "label") @Column(name = "label")
private Set<String> labels = new HashSet<>(); private Set<String> labels = new HashSet<>();
@JoinTable // @JoinTable
@OneToMany(fetch = FetchType.LAZY) // @OneToMany(fetch = FetchType.LAZY)
private List<Note> notes = new ArrayList<>(); // private List<Note> notes = new ArrayList<>();
} }

View File

@ -13,6 +13,7 @@ import javax.persistence.Id;
import javax.persistence.Inheritance; import javax.persistence.Inheritance;
import javax.persistence.InheritanceType; import javax.persistence.InheritanceType;
import javax.persistence.JoinColumn; import javax.persistence.JoinColumn;
import javax.persistence.JoinTable;
import javax.persistence.ManyToOne; import javax.persistence.ManyToOne;
import javax.persistence.Table; import javax.persistence.Table;
import java.time.LocalDateTime; import java.time.LocalDateTime;
@ -62,4 +63,12 @@ public class Note implements BasicEntity<Long> {
@Column(name = "web_url") @Column(name = "web_url")
private String webUrl; private String webUrl;
@ManyToOne
@JoinTable(
name = "merge_request_notes",
joinColumns = @JoinColumn(name = "notes_id"),
inverseJoinColumns = @JoinColumn(name = "merge_request_id")
)
private MergeRequest mergeRequest;
} }

View File

@ -1,5 +1,6 @@
package org.sadtech.bot.gitlab.context.repository; package org.sadtech.bot.gitlab.context.repository;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Note; import org.sadtech.bot.gitlab.context.domain.entity.Note;
import org.sadtech.haiti.context.repository.SimpleManagerRepository; import org.sadtech.haiti.context.repository.SimpleManagerRepository;
@ -10,4 +11,6 @@ import org.sadtech.haiti.context.repository.SimpleManagerRepository;
*/ */
public interface NoteRepository extends SimpleManagerRepository<Note, Long> { public interface NoteRepository extends SimpleManagerRepository<Note, Long> {
void link(@NonNull Long noteId, @NonNull Long mergeRequestId);
} }

View File

@ -1,8 +1,13 @@
package org.sadtech.bot.gitlab.context.repository; package org.sadtech.bot.gitlab.context.repository;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
import org.sadtech.haiti.context.page.Pagination;
import org.sadtech.haiti.context.page.Sheet;
import org.sadtech.haiti.context.repository.SimpleManagerRepository; import org.sadtech.haiti.context.repository.SimpleManagerRepository;
public interface TaskRepository extends SimpleManagerRepository<Task, Long> { public interface TaskRepository extends SimpleManagerRepository<Task, Long> {
Sheet<Task> findAllByResolved(boolean resolved, @NonNull Pagination pagination);
} }

View File

@ -1,8 +1,11 @@
package org.sadtech.bot.gitlab.context.service; package org.sadtech.bot.gitlab.context.service;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Note; import org.sadtech.bot.gitlab.context.domain.entity.Note;
import org.sadtech.haiti.context.service.SimpleManagerService; import org.sadtech.haiti.context.service.SimpleManagerService;
public interface NoteService extends SimpleManagerService<Note, Long> { public interface NoteService extends SimpleManagerService<Note, Long> {
void link(@NonNull Long noteId, Long mergeRequestId);
} }

View File

@ -1,8 +1,13 @@
package org.sadtech.bot.gitlab.context.service; package org.sadtech.bot.gitlab.context.service;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
import org.sadtech.haiti.context.page.Pagination;
import org.sadtech.haiti.context.page.Sheet;
import org.sadtech.haiti.context.service.SimpleManagerService; import org.sadtech.haiti.context.service.SimpleManagerService;
public interface TaskService extends SimpleManagerService<Task, Long> { public interface TaskService extends SimpleManagerService<Task, Long> {
Sheet<Task> getAllByResolved(boolean resolved, @NonNull Pagination pagination);
} }

View File

@ -46,4 +46,6 @@ public class GitlabProperty {
private String urlNote; private String urlNote;
private String urlNoteApi;
} }

View File

@ -37,7 +37,7 @@ public class NoteServiceImpl extends AbstractNoteService<Note> implements NoteSe
if (!oldNote.getUpdated().equals(note.getUpdated())) { if (!oldNote.getUpdated().equals(note.getUpdated())) {
note.setWebUrl(oldNote.getWebUrl()); note.setWebUrl(oldNote.getWebUrl());
return noteRepository.save(oldNote); return noteRepository.save(note);
} }
// updateAnswer(oldNote, note); // updateAnswer(oldNote, note);
@ -70,4 +70,9 @@ public class NoteServiceImpl extends AbstractNoteService<Note> implements NoteSe
// } // }
} }
@Override
public void link(@NonNull Long noteId, @NonNull Long mergeRequestId) {
noteRepository.link(noteId, mergeRequestId);
}
} }

View File

@ -9,6 +9,8 @@ import org.sadtech.bot.gitlab.context.repository.TaskRepository;
import org.sadtech.bot.gitlab.context.service.NotifyService; import org.sadtech.bot.gitlab.context.service.NotifyService;
import org.sadtech.bot.gitlab.context.service.TaskService; import org.sadtech.bot.gitlab.context.service.TaskService;
import org.sadtech.haiti.context.exception.NotFoundException; import org.sadtech.haiti.context.exception.NotFoundException;
import org.sadtech.haiti.context.page.Pagination;
import org.sadtech.haiti.context.page.Sheet;
import org.springframework.stereotype.Service; import org.springframework.stereotype.Service;
@Service @Service
@ -41,14 +43,15 @@ public class TaskServiceImpl extends AbstractNoteService<Task> implements TaskSe
final Task oldTask = taskRepository.findById(task.getId()) final Task oldTask = taskRepository.findById(task.getId())
.orElseThrow(() -> new NotFoundException("Задача не найдена")); .orElseThrow(() -> new NotFoundException("Задача не найдена"));
if (oldTask.getUpdated().equals(task.getUpdated())) { if (!oldTask.getUpdated().equals(task.getUpdated())) {
task.setMergeRequest(oldTask.getMergeRequest());
task.setWebUrl(oldTask.getWebUrl()); task.setWebUrl(oldTask.getWebUrl());
task.setResponsible(oldTask.getResponsible()); task.setResponsible(oldTask.getResponsible());
notifyUpdateStatus(oldTask, task); notifyUpdateStatus(oldTask, task);
return taskRepository.save(oldTask); return taskRepository.save(task);
} }
return oldTask; return oldTask;
} }
@ -56,8 +59,6 @@ public class TaskServiceImpl extends AbstractNoteService<Task> implements TaskSe
private void notifyUpdateStatus(Task oldTask, Task task) { private void notifyUpdateStatus(Task oldTask, Task task) {
if ( if (
personInformation.getId().equals(oldTask.getAuthor().getId()) personInformation.getId().equals(oldTask.getAuthor().getId())
&& !personInformation.getId().equals(oldTask.getResolvedBy().getId())
) { ) {
final boolean oldStatus = oldTask.getResolved(); final boolean oldStatus = oldTask.getResolved();
final boolean newStatus = task.getResolved(); final boolean newStatus = task.getResolved();
@ -86,4 +87,9 @@ public class TaskServiceImpl extends AbstractNoteService<Task> implements TaskSe
} }
} }
@Override
public Sheet<Task> getAllByResolved(boolean resolved, @NonNull Pagination pagination) {
return taskRepository.findAllByResolved(resolved, pagination);
}
} }

View File

@ -1,6 +1,5 @@
package org.sadtech.bot.gitlab.core.service.parser; package org.sadtech.bot.gitlab.core.service.parser;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.MergeRequest; import org.sadtech.bot.gitlab.context.domain.entity.MergeRequest;
import org.sadtech.bot.gitlab.context.domain.entity.Note; import org.sadtech.bot.gitlab.context.domain.entity.Note;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
@ -11,6 +10,7 @@ import org.sadtech.bot.gitlab.core.config.properties.GitlabProperty;
import org.sadtech.bot.gitlab.core.config.properties.PersonProperty; import org.sadtech.bot.gitlab.core.config.properties.PersonProperty;
import org.sadtech.bot.gitlab.sdk.domain.NoteJson; import org.sadtech.bot.gitlab.sdk.domain.NoteJson;
import org.sadtech.haiti.context.domain.ExistsContainer; import org.sadtech.haiti.context.domain.ExistsContainer;
import org.sadtech.haiti.context.exception.ConvertException;
import org.sadtech.haiti.context.page.Sheet; import org.sadtech.haiti.context.page.Sheet;
import org.sadtech.haiti.core.page.PaginationImpl; import org.sadtech.haiti.core.page.PaginationImpl;
import org.sadtech.haiti.utils.network.HttpParse; import org.sadtech.haiti.utils.network.HttpParse;
@ -122,7 +122,8 @@ public class NoteParser {
) )
.collect(Collectors.toList()); .collect(Collectors.toList());
taskService.createAll(newNotes); final List<Task> newTasks = taskService.createAll(newNotes);
newTasks.forEach(task -> noteService.link(task.getId(), mergeRequest.getId()));
} }
} }
@ -138,7 +139,7 @@ public class NoteParser {
final ExistsContainer<Note, Long> existsContainer = noteService.existsById(jsonIds); final ExistsContainer<Note, Long> existsContainer = noteService.existsById(jsonIds);
if (!existsContainer.isAllFound()) { if (!existsContainer.isAllFound()) {
final List<Note> newNotes = newJsons.stream() final List<Note> notes = newJsons.stream()
.filter(json -> existsContainer.getIdNoFound().contains(json.getId())) .filter(json -> existsContainer.getIdNoFound().contains(json.getId()))
.map(json -> conversionService.convert(json, Note.class)) .map(json -> conversionService.convert(json, Note.class))
.peek(note -> note.setWebUrl( .peek(note -> note.setWebUrl(
@ -146,7 +147,36 @@ public class NoteParser {
) )
.collect(Collectors.toList()); .collect(Collectors.toList());
noteService.createAll(newNotes); final List<Note> newNotes = noteService.createAll(notes);
newNotes.forEach(note -> noteService.link(note.getId(), mergeRequest.getId()));
}
}
public void scanOldTask() {
int page = 0;
Sheet<Task> taskSheet = taskService.getAllByResolved(false, PaginationImpl.of(page, COUNT));
while (taskSheet.hasContent()) {
final List<Task> tasks = taskSheet.getContent();
for (Task task : tasks) {
final MergeRequest mergeRequest = task.getMergeRequest();
final Task newTask = HttpParse.request(MessageFormat.format(
gitlabProperty.getUrlNoteApi(),
mergeRequest.getProjectId(),
mergeRequest.getTwoId(),
task.getId())
)
.header(ACCEPT)
.header(AUTHORIZATION, BEARER + personProperty.getToken())
.execute(NoteJson.class)
.map(json -> conversionService.convert(json, Task.class))
.orElseThrow(() -> new ConvertException("Ошибка обработки задачи"));
taskService.update(newTask);
}
taskSheet = taskService.getAllByResolved(false, PaginationImpl.of(++page, COUNT));
} }
} }
@ -207,65 +237,4 @@ public class NoteParser {
// .collect(Collectors.toList()); // .collect(Collectors.toList());
// } // }
private String generateUrl(@NonNull Long id, @NonNull String pullRequestUrl) {
return MessageFormat.format("{0}/overview?commentId={1}", pullRequestUrl, Long.toString(id));
}
private String getCommentUrl(long commentId, MergeRequest mergeRequest) {
// return gitlabProperty.getUrlPullRequestComment()
// .replace("{projectKey}", mergeRequest.getProjectKey())
// .replace("{repositorySlug}", mergeRequest.getRepositorySlug())
// .replace("{pullRequestId}", mergeRequest.getBitbucketId().toString())
// .replace("{commentId}", String.valueOf(commentId));
return null;
}
public void scanOldComment() {
// final List<Comment> comments = commentService.getAllBetweenDate(
// LocalDateTime.now().minusDays(20), LocalDateTime.now()
// );
// for (Comment oldComment : comments) {
// final Optional<CommentJson> optCommentJson = Utils.urlToJson(
// oldComment.getUrlApi(),
// gitlabProperty.getToken(),
// CommentJson.class
// );
// if (optCommentJson.isPresent()) {
// final CommentJson json = optCommentJson.get();
// if (Severity.BLOCKER.equals(json.getSeverity())) {
// taskService.convert(oldComment);
// } else {
// final Comment newComment = conversionService.convert(json, Comment.class);
// commentService.update(newComment);
// }
// } else {
// commentService.deleteById(oldComment.getId());
// }
// }
}
public void scanOldTask() {
// final List<Task> tasks = taskService.getAllBetweenDate(
// LocalDateTime.now().minusDays(20), LocalDateTime.now()
// );
// for (Task oldTask : tasks) {
// final Optional<CommentJson> optCommentJson = Utils.urlToJson(
// oldTask.getUrlApi(),
// gitlabProperty.getToken(),
// CommentJson.class
// );
// if (optCommentJson.isPresent()) {
// final CommentJson json = optCommentJson.get();
// if (Severity.NORMAL.equals(json.getSeverity())) {
// commentService.convert(oldTask);
// } else {
// final Task newTask = conversionService.convert(json, Task.class);
// taskService.update(newTask);
// }
// } else {
// taskService.deleteById(oldTask.getId());
// }
// }
}
} }

View File

@ -1,5 +1,6 @@
package org.sadtech.bot.gitlab.data.impl; package org.sadtech.bot.gitlab.data.impl;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Note; import org.sadtech.bot.gitlab.context.domain.entity.Note;
import org.sadtech.bot.gitlab.context.repository.NoteRepository; import org.sadtech.bot.gitlab.context.repository.NoteRepository;
import org.sadtech.bot.gitlab.data.jpa.CommentRepositoryJpa; import org.sadtech.bot.gitlab.data.jpa.CommentRepositoryJpa;
@ -21,4 +22,9 @@ public class NoteRepositoryImpl extends AbstractSimpleManagerRepository<Note, Lo
this.repositoryJpa = repositoryJpa; this.repositoryJpa = repositoryJpa;
} }
@Override
public void link(@NonNull Long noteId, @NonNull Long mergeRequestId) {
repositoryJpa.link(noteId, mergeRequestId);
}
} }

View File

@ -1,9 +1,13 @@
package org.sadtech.bot.gitlab.data.impl; package org.sadtech.bot.gitlab.data.impl;
import lombok.NonNull;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
import org.sadtech.bot.gitlab.context.repository.TaskRepository; import org.sadtech.bot.gitlab.context.repository.TaskRepository;
import org.sadtech.bot.gitlab.data.jpa.TaskRepositoryJpa; import org.sadtech.bot.gitlab.data.jpa.TaskRepositoryJpa;
import org.sadtech.haiti.context.page.Pagination;
import org.sadtech.haiti.context.page.Sheet;
import org.sadtech.haiti.database.repository.manager.AbstractSimpleManagerRepository; import org.sadtech.haiti.database.repository.manager.AbstractSimpleManagerRepository;
import org.sadtech.haiti.database.util.Converter;
import org.springframework.stereotype.Repository; import org.springframework.stereotype.Repository;
@Repository @Repository
@ -16,4 +20,10 @@ public class TaskRepositoryImpl extends AbstractSimpleManagerRepository<Task, Lo
this.taskRepositoryJpa = taskRepositoryJpa; this.taskRepositoryJpa = taskRepositoryJpa;
} }
@Override
public Sheet<Task> findAllByResolved(boolean resolved, @NonNull Pagination pagination) {
return Converter.page(
taskRepositoryJpa.findAllByResolved(resolved, Converter.pagination(pagination))
);
}
} }

View File

@ -2,7 +2,16 @@ package org.sadtech.bot.gitlab.data.jpa;
import org.sadtech.bot.gitlab.context.domain.entity.Note; import org.sadtech.bot.gitlab.context.domain.entity.Note;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Modifying;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;
import org.springframework.transaction.annotation.Transactional;
public interface CommentRepositoryJpa extends JpaRepository<Note, Long> { public interface CommentRepositoryJpa extends JpaRepository<Note, Long> {
@Modifying
@Transactional
@Query(value = "INSERT INTO gitlab_bot.public.merge_request_notes(merge_request_id, notes_id) values (:mergeRequestId, :noteId)", nativeQuery = true)
void link(@Param("noteId") Long noteId, @Param("mergeRequestId") Long mergeRequestId);
} }

View File

@ -1,8 +1,12 @@
package org.sadtech.bot.gitlab.data.jpa; package org.sadtech.bot.gitlab.data.jpa;
import org.sadtech.bot.gitlab.context.domain.entity.Task; import org.sadtech.bot.gitlab.context.domain.entity.Task;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository; import org.springframework.data.jpa.repository.JpaRepository;
public interface TaskRepositoryJpa extends JpaRepository<Task, Long> { public interface TaskRepositoryJpa extends JpaRepository<Task, Long> {
Page<Task> findAllByResolved(boolean resolved, Pageable pageable);
} }