Compare commits
9 Commits
bbc9093769
...
99c9cd5ee2
Author | SHA1 | Date | |
---|---|---|---|
99c9cd5ee2 | |||
157ff0b4f0 | |||
c13fe02b2d | |||
6a1a69fa01 | |||
28661d5a19 | |||
68fd0c496b | |||
|
c798343973 | ||
|
e8ef39cdb7 | ||
|
6d6d48bf1a |
135
README.md
135
README.md
@ -1,30 +1,57 @@
|
|||||||
# Уведомления GitLab в Telegram
|
# Уведомления GitLab в Telegram
|
||||||
|
|
||||||
Это приложение позволит вам получать уведомления о событиях из GitLab.
|
Этот проект позволяет оперативно получать и настраивать персональные уведомления о событиях из GitLab.
|
||||||
|
|
||||||
> Статья-документация: https://struchkov.dev/blog/gitlab-telegram-bot/
|
> Статья о проекте: https://struchkov.dev/blog/gitlab-telegram-bot/
|
||||||
>
|
> Канал в Telegram, в который публикуется информация о разработке: https://t.me/gitlab_notification
|
||||||
> Исходный код: https://github.com/uPagge/gitlab-notification
|
|
||||||
|
|
||||||
## Возможности бота
|
> ⚠️На данный момент вся разработка ведется в моем Gitea: https://git.struchkov.dev/Telegram-Bots/gitlab-notification
|
||||||
1. Уведомление о новых MergeRequest
|
> GitHub остается для удобства пользователей проекта, чтобы иметь возможность давать обратную связь по багам и
|
||||||
2. Уведомление о возникновении конфликта в MergeRequest
|
> предложениям.
|
||||||
3. Уведомление о добавлении вас в новый проект
|
|
||||||
4. Уведомление о смене статуса вашего MergeRequest
|
> ⚠️Идет активная подготовка к выпуску версии 2.0.0, в котором будут исправлены все существующие баги, а также добавлена
|
||||||
5. Уведомление о комментариях, в которых вас упоминают в формате @nickname
|
> поддержка уведомлений Issue.
|
||||||
6. Уведомит о новой задаче в вашем MR.
|
> На данный момент лучше использовать тег develop, вместо latest.
|
||||||
7. Уведомит о закрытии вашей задачи в чужом MR
|
|
||||||
8. Уведомление о Pipeline
|
## Основные возможности
|
||||||
|
|
||||||
|
1. Уведомление о новых Merge Request.
|
||||||
|
2. Уведомление о возникновении конфликта в MergeRequest.
|
||||||
|
3. Уведомление о появлении нового проекта.
|
||||||
|
4. Уведомление о смене статуса вашего MergeRequest.
|
||||||
|
5. Уведомление о комментариях, в которых вас упоминают в формате @nickname.
|
||||||
|
6. Уведомит о новом комментарии-треде в вашем MR.
|
||||||
|
7. Уведомит о закрытии вашего треда в чужом MR.
|
||||||
|
8. Уведомление о результате сборки.
|
||||||
|
|
||||||
## Как запустить
|
## Как запустить
|
||||||
|
|
||||||
1. Для начала нужно создать бота, который будет посылать вам уведомления в телеграмм. Делается это в [специальном боте](https://t.me/botfather)
|
1. Для начала нужно создать бота, который будет посылать вам уведомления. Делается это
|
||||||
2. После создания вы получите токен, сохраните его. Пример: 34534050345:FlfrleflerferfRE-ergerFLREF9ERF-NGjM
|
в [специальном боте](https://t.me/botfather)
|
||||||
3. Теперь необходимо получить персональный токен в вашем gitlab. Достаточно токена на чтение. Сохраните его
|
2. После создания вы получите токен, сохраните его. Пример: `34534050345:FlfrleflerferfRE-ergerFLREF9ERF-NGjM`
|
||||||
4. Создайте базу данных gitlab_bot. **Обязательно именно такое название**
|
3. Теперь необходимо получить персональный токен в вашем gitlab. Достаточно токена на чтение.
|
||||||
4. Можно приступать к запуску
|
4. Можно приступать к запуску используя один из способов ниже.
|
||||||
|
|
||||||
|
### Переменные среды
|
||||||
|
|
||||||
|
* `TELEGRAM_BOT_TOKEN` -- токен, который вы получили при создание бота.
|
||||||
|
* `TELEGRAM_BOT_USERNAME` -- название, которое вы дали боту. Пример my_gitlab_bot.
|
||||||
|
* `GITLAB_PERSONAL_TOKEN` -- ваш персональный токен из GitLab.
|
||||||
|
* `TELEGRAM_PERSON_ID` -- ваш id в телеграм, можно узнать у [этого бота](https://t.me/myidbot)
|
||||||
|
* `GITLAB_URL` -- можно указать https://gitlab.com или url на ваш локальный/корпоративный GitLab строго в таком
|
||||||
|
формате http://localhost:7990.
|
||||||
|
* `DATASOURCE_URL` -- ссылка на базу данных Postgres, в следующем формате: jdbc:postgresql://localhost:5432/gitlab_bot
|
||||||
|
* `DATASOURCE_USERNAME` -- пользовать базы данных
|
||||||
|
* `DATASOURCE_PASSWORD` -- пароль пользователя базы данных
|
||||||
|
|
||||||
|
### Запуск
|
||||||
|
|
||||||
|
Есть несколько способов запуска. Для удобства я собрал проект в Docker образ, а также подготовил Docker Compose.
|
||||||
|
|
||||||
|
#### Docker
|
||||||
|
|
||||||
|
Подойдет, если вы не хотите поднимать отдельный контейнер с базой данных
|
||||||
|
|
||||||
### Пример запуска
|
|
||||||
```
|
```
|
||||||
sudo docker run --name gitlab-notify \
|
sudo docker run --name gitlab-notify \
|
||||||
--env TELEGRAM_BOT_TOKEN=value \
|
--env TELEGRAM_BOT_TOKEN=value \
|
||||||
@ -38,15 +65,65 @@ sudo docker run --name gitlab-notify \
|
|||||||
--network="host" upagge/gitlab-telegram-notify:latest
|
--network="host" upagge/gitlab-telegram-notify:latest
|
||||||
```
|
```
|
||||||
|
|
||||||
#### Переменные
|
#### Docker Compose
|
||||||
|
|
||||||
* `TELEGRAM_BOT_TOKEN` -- токен, который вы получили при создание бота.
|
Самый простой способ запуска.
|
||||||
* `TELEGRAM_BOT_USERNAME` -- название, которое вы дали боту. Пример my_gitlab_bot
|
|
||||||
* `GITLAB_PERSONAL_TOKEN` -- токен, который вы получили в GitLab
|
|
||||||
* `TELEGRAM_PERSON_ID` -- ваш id в телеграм, можно узнать у [этого бота](https://t.me/myidbot)
|
|
||||||
* `GITLAB_URL` -- можно указать https://gitlab.com или url на ваш локальный GitLab строго в таком формате http://localhost:7990
|
|
||||||
* `DATASOURCE_URL` -- ссылка на базу данных Postgres, в следующем формате: jdbc:postgresql://localhost:5432/gitlab_bot
|
|
||||||
* `DATASOURCE_USERNAME` -- пользовать бд
|
|
||||||
* `DATASOURCE_PASSWORD` -- пароль от бд
|
|
||||||
|
|
||||||
После этого необходимо отправить боту сообщение, чтобы пройти первичную настройку.
|
docker-compose.yml
|
||||||
|
```yaml
|
||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
|
||||||
|
gitlab-bot-database:
|
||||||
|
image: postgres:15.1-alpine
|
||||||
|
restart: always
|
||||||
|
hostname: gitlab-bot-database
|
||||||
|
container_name: gitlab-bot-database
|
||||||
|
networks:
|
||||||
|
gitlab-bot:
|
||||||
|
environment:
|
||||||
|
POSTGRES_DB: "gitlab_bot"
|
||||||
|
POSTGRES_USER: "postgres"
|
||||||
|
POSTGRES_PASSWORD: ${DATASOURCE_PASSWORD}
|
||||||
|
volumes:
|
||||||
|
- gitlab-bot-database:/var/lib/postgresql/data/
|
||||||
|
|
||||||
|
gitlab-bot:
|
||||||
|
image: upagge/gitlab-telegram-notify:latest
|
||||||
|
hostname: gitlab-bot
|
||||||
|
container_name: gitlab-bot
|
||||||
|
privileged: true
|
||||||
|
networks:
|
||||||
|
gitlab-bot:
|
||||||
|
depends_on:
|
||||||
|
- gitlab-bot-database
|
||||||
|
environment:
|
||||||
|
TELEGRAM_BOT_TOKEN: ${TELEGRAM_BOT_TOKEN}
|
||||||
|
TELEGRAM_BOT_USERNAME: ${TELEGRAM_BOT_USERNAME}
|
||||||
|
GITLAB_PERSONAL_TOKEN: ${GITLAB_PERSONAL_TOKEN}
|
||||||
|
TELEGRAM_PERSON_ID: ${TELEGRAM_PERSON_ID}
|
||||||
|
GITLAB_URL: ${GITLAB_URL}
|
||||||
|
DATASOURCE_URL: "jdbc:postgresql://gitlab-bot-database:5432/gitlab_bot"
|
||||||
|
DATASOURCE_USERNAME: ${DATASOURCE_USERNAME}
|
||||||
|
DATASOURCE_PASSWORD: ${DATASOURCE_PASSWORD}
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
gitlab-bot-database:
|
||||||
|
|
||||||
|
networks:
|
||||||
|
gitlab-bot:
|
||||||
|
```
|
||||||
|
|
||||||
|
.env
|
||||||
|
```
|
||||||
|
TELEGRAM_BOT_TOKEN=
|
||||||
|
TELEGRAM_BOT_USERNAME=
|
||||||
|
GITLAB_PERSONAL_TOKEN=
|
||||||
|
TELEGRAM_PERSON_ID=
|
||||||
|
GITLAB_URL=
|
||||||
|
DATASOURCE_USERNAME=
|
||||||
|
DATASOURCE_PASSWORD=
|
||||||
|
```
|
||||||
|
|
||||||
|
После запуска необходимо отправить боту сообщение, чтобы пройти первичную настройку.
|
||||||
|
@ -0,0 +1,30 @@
|
|||||||
|
package dev.struchkov.bot.gitlab.context.domain.notify.mergerequest;
|
||||||
|
|
||||||
|
import lombok.Builder;
|
||||||
|
import lombok.Getter;
|
||||||
|
|
||||||
|
@Getter
|
||||||
|
public class ConflictResolveMrNotify extends MrNotify {
|
||||||
|
|
||||||
|
public static final String TYPE = "ConflictResolveMrNotify";
|
||||||
|
|
||||||
|
private final String sourceBranch;
|
||||||
|
|
||||||
|
@Builder
|
||||||
|
private ConflictResolveMrNotify(
|
||||||
|
Long mrId,
|
||||||
|
String name,
|
||||||
|
String url,
|
||||||
|
String projectKey,
|
||||||
|
String sourceBranch
|
||||||
|
) {
|
||||||
|
super(mrId, projectKey, name, url);
|
||||||
|
this.sourceBranch = sourceBranch;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getType() {
|
||||||
|
return TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -28,6 +28,8 @@ public interface MergeRequestRepository {
|
|||||||
|
|
||||||
Set<Long> findAllIds();
|
Set<Long> findAllIds();
|
||||||
|
|
||||||
void disableNotify(Long mrId);
|
void notification(boolean enable, Long mrId);
|
||||||
|
|
||||||
|
void notificationByProjectId(boolean enable, Set<Long> projectIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -38,6 +38,8 @@ public interface MergeRequestsService {
|
|||||||
|
|
||||||
Set<Long> getAllIds();
|
Set<Long> getAllIds();
|
||||||
|
|
||||||
void disableNotify(@NonNull Long mrId);
|
void notification(boolean enable, @NonNull Long mrId);
|
||||||
|
|
||||||
|
void notificationByProjectId(boolean enable, @NonNull Set<Long> projectIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -16,6 +16,7 @@ public class Icons {
|
|||||||
public static final String TASK = "\uD83D\uDCBC";
|
public static final String TASK = "\uD83D\uDCBC";
|
||||||
public static final String ARROW = " ➜ ";
|
public static final String ARROW = " ➜ ";
|
||||||
public static final String DANGEROUS = "⚠️";
|
public static final String DANGEROUS = "⚠️";
|
||||||
|
public static final String GREEN_CIRCLE = "\uD83D\uDFE2";
|
||||||
public static final String PEN = "✏️";
|
public static final String PEN = "✏️";
|
||||||
public static final String ASSIGNEE = "\uD83C\uDFA9";
|
public static final String ASSIGNEE = "\uD83C\uDFA9";
|
||||||
public static final String BUILD = "⚙️";
|
public static final String BUILD = "⚙️";
|
||||||
|
@ -12,6 +12,7 @@ import dev.struchkov.bot.gitlab.context.domain.entity.MergeRequestForDiscussion;
|
|||||||
import dev.struchkov.bot.gitlab.context.domain.entity.Person;
|
import dev.struchkov.bot.gitlab.context.domain.entity.Person;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.entity.Project;
|
import dev.struchkov.bot.gitlab.context.domain.entity.Project;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictMrNotify;
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictMrNotify;
|
||||||
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictResolveMrNotify;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForAssignee;
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForAssignee;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForReview;
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.NewMrForReview;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.StatusMrNotify;
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.StatusMrNotify;
|
||||||
@ -179,7 +180,8 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
|
|||||||
|
|
||||||
if (isChangedMr) {
|
if (isChangedMr) {
|
||||||
notifyAboutStatus(oldMergeRequest, mergeRequest, project);
|
notifyAboutStatus(oldMergeRequest, mergeRequest, project);
|
||||||
notifyAboutConflict(oldMergeRequest, mergeRequest, project);
|
notifyAboutNewConflict(oldMergeRequest, mergeRequest, project);
|
||||||
|
notifyAboutResolveConflict(oldMergeRequest, mergeRequest, project);
|
||||||
notifyAboutUpdate(oldMergeRequest, mergeRequest, project);
|
notifyAboutUpdate(oldMergeRequest, mergeRequest, project);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -195,14 +197,15 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
|
|||||||
}
|
}
|
||||||
|
|
||||||
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление
|
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление
|
||||||
|
|
||||||
private void notifyAssignee(AssigneeChanged assigneeChanged, MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
private void notifyAssignee(AssigneeChanged assigneeChanged, MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
||||||
switch (assigneeChanged) {
|
switch (assigneeChanged) {
|
||||||
case BECOME ->
|
case BECOME ->
|
||||||
sendNotifyNewAssignee(mergeRequest, project.getName(), Optional.ofNullable(oldMergeRequest.getAssignee()).map(Person::getName).orElse(null));
|
sendNotifyNewAssignee(mergeRequest, project.getName(), Optional.ofNullable(oldMergeRequest.getAssignee()).map(Person::getName).orElse(null));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление ревьювера
|
//TODO [05.12.2022|uPagge]: Добавить уведомление, если происходит удаление ревьювера
|
||||||
|
|
||||||
private void notifyReviewer(ReviewerChanged reviewerChanged, MergeRequest mergeRequest, Project project) {
|
private void notifyReviewer(ReviewerChanged reviewerChanged, MergeRequest mergeRequest, Project project) {
|
||||||
switch (reviewerChanged) {
|
switch (reviewerChanged) {
|
||||||
case BECOME -> sendNotifyNewMrReview(mergeRequest, project.getName());
|
case BECOME -> sendNotifyNewMrReview(mergeRequest, project.getName());
|
||||||
@ -268,8 +271,14 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
|
|||||||
|
|
||||||
@Override
|
@Override
|
||||||
@Transactional
|
@Transactional
|
||||||
public void disableNotify(@NonNull Long mrId) {
|
public void notification(boolean enable, @NonNull Long mrId) {
|
||||||
repository.disableNotify(mrId);
|
repository.notification(enable, mrId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
@Transactional
|
||||||
|
public void notificationByProjectId(boolean enable, @NonNull Set<Long> projectIds) {
|
||||||
|
repository.notificationByProjectId(enable, projectIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
private void notifyAboutUpdate(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
||||||
@ -317,7 +326,7 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
protected void notifyAboutConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
protected void notifyAboutNewConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
||||||
final Long gitlabUserId = personInformation.getId();
|
final Long gitlabUserId = personInformation.getId();
|
||||||
if (
|
if (
|
||||||
!oldMergeRequest.isConflict() // У старого MR не было конфликта
|
!oldMergeRequest.isConflict() // У старого MR не было конфликта
|
||||||
@ -336,6 +345,25 @@ public class MergeRequestsServiceImpl implements MergeRequestsService {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void notifyAboutResolveConflict(MergeRequest oldMergeRequest, MergeRequest mergeRequest, Project project) {
|
||||||
|
final Long gitlabUserId = personInformation.getId();
|
||||||
|
if (
|
||||||
|
oldMergeRequest.isConflict() // У старого MR был конфликт
|
||||||
|
&& !mergeRequest.isConflict() // А у нового нет
|
||||||
|
&& gitlabUserId.equals(oldMergeRequest.getAuthor().getId()) // и MR создан пользователем бота
|
||||||
|
) {
|
||||||
|
notifyService.send(
|
||||||
|
ConflictResolveMrNotify.builder()
|
||||||
|
.mrId(oldMergeRequest.getId())
|
||||||
|
.sourceBranch(oldMergeRequest.getSourceBranch())
|
||||||
|
.name(mergeRequest.getTitle())
|
||||||
|
.url(mergeRequest.getWebUrl())
|
||||||
|
.projectKey(project.getName())
|
||||||
|
.build()
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) {
|
protected void notifyAboutStatus(MergeRequest oldMergeRequest, MergeRequest newMergeRequest, Project project) {
|
||||||
final MergeRequestState oldStatus = oldMergeRequest.getState();
|
final MergeRequestState oldStatus = oldMergeRequest.getState();
|
||||||
final MergeRequestState newStatus = newMergeRequest.getState();
|
final MergeRequestState newStatus = newMergeRequest.getState();
|
||||||
|
@ -3,6 +3,7 @@ package dev.struchkov.bot.gitlab.core.service.parser;
|
|||||||
import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
|
import dev.struchkov.bot.gitlab.context.domain.ExistContainer;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.entity.Person;
|
import dev.struchkov.bot.gitlab.context.domain.entity.Person;
|
||||||
import dev.struchkov.bot.gitlab.context.domain.entity.Project;
|
import dev.struchkov.bot.gitlab.context.domain.entity.Project;
|
||||||
|
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
|
||||||
import dev.struchkov.bot.gitlab.context.service.PersonService;
|
import dev.struchkov.bot.gitlab.context.service.PersonService;
|
||||||
import dev.struchkov.bot.gitlab.context.service.ProjectService;
|
import dev.struchkov.bot.gitlab.context.service.ProjectService;
|
||||||
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
|
import dev.struchkov.bot.gitlab.core.config.properties.GitlabProperty;
|
||||||
@ -39,8 +40,8 @@ public class ProjectParser {
|
|||||||
|
|
||||||
public static final String OWNER = "&owned=true";
|
public static final String OWNER = "&owned=true";
|
||||||
public static final String PRIVATE = "&visibility=private";
|
public static final String PRIVATE = "&visibility=private";
|
||||||
public static final String PUBLIC_OWNER = "&visibility=public&owned=true";
|
|
||||||
|
|
||||||
|
private final MergeRequestsService mergeRequestsService;
|
||||||
private final ProjectService projectService;
|
private final ProjectService projectService;
|
||||||
private final PersonService personService;
|
private final PersonService personService;
|
||||||
|
|
||||||
@ -99,8 +100,10 @@ public class ProjectParser {
|
|||||||
final Project newProject = conversionService.convert(projectJson, Project.class);
|
final Project newProject = conversionService.convert(projectJson, Project.class);
|
||||||
projectService.create(newProject);
|
projectService.create(newProject);
|
||||||
} else {
|
} else {
|
||||||
projectService.notification(true, singleton(projectJson.getId()));
|
final Set<Long> projectId = singleton(projectJson.getId());
|
||||||
projectService.processing(true, singleton(projectJson.getId()));
|
projectService.notification(true, projectId);
|
||||||
|
projectService.processing(true, projectId);
|
||||||
|
mergeRequestsService.notificationByProjectId(true, projectId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -71,8 +71,13 @@ public class MergeRequestRepositoryImpl implements MergeRequestRepository {
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void disableNotify(Long mrId) {
|
public void notification(boolean enable, Long mrId) {
|
||||||
jpaRepository.disableNotify(mrId);
|
jpaRepository.disableNotify(enable, mrId);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void notificationByProjectId(boolean enable, Set<Long> projectIds) {
|
||||||
|
jpaRepository.notificationByProjectId(enable, projectIds);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -29,7 +29,11 @@ public interface MergeRequestJpaRepository extends JpaRepositoryImplementation<M
|
|||||||
Set<Long> findAllIds();
|
Set<Long> findAllIds();
|
||||||
|
|
||||||
@Modifying
|
@Modifying
|
||||||
@Query("UPDATE MergeRequest mr SET mr.notification = false WHERE mr.id = :mrId")
|
@Query("UPDATE MergeRequest mr SET mr.notification = :enable WHERE mr.id = :mrId")
|
||||||
void disableNotify(@Param("mrId") Long mrId);
|
void disableNotify(@Param("enable") boolean enable, @Param("mrId") Long mrId);
|
||||||
|
|
||||||
|
@Modifying
|
||||||
|
@Query("UPDATE MergeRequest mr SET mr.notification = :enable WHERE mr.projectId in :projectIds")
|
||||||
|
void notificationByProjectId(@Param("enable") boolean enable, @Param("projectIds") Set<Long> projectIds);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5,8 +5,15 @@ import dev.struchkov.bot.gitlab.context.utils.Icons;
|
|||||||
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
import org.springframework.stereotype.Component;
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
import static dev.struchkov.bot.gitlab.context.utils.Icons.link;
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_CONFIRMATION;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_DISABLE_NOTIFY_MR_ID;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_VALUE_FALSE;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.UnitName.DELETE_MESSAGE;
|
||||||
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
|
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
|
||||||
|
import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.simpleButton;
|
||||||
|
import static dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine.simpleLine;
|
||||||
|
import static dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard.inlineKeyBoard;
|
||||||
|
import static dev.struchkov.godfather.telegram.domain.keyboard.button.UrlButton.urlButton;
|
||||||
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
|
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
|
||||||
|
|
||||||
@Component
|
@Component
|
||||||
@ -15,12 +22,24 @@ public class ConflictPrNotifyGenerator implements NotifyBoxAnswerGenerator<Confl
|
|||||||
@Override
|
@Override
|
||||||
public BoxAnswer generate(ConflictMrNotify notify) {
|
public BoxAnswer generate(ConflictMrNotify notify) {
|
||||||
|
|
||||||
final StringBuilder builder = new StringBuilder(Icons.DANGEROUS).append(" *Attention! MergeRequest conflict | ").append(escapeMarkdown(notify.getProjectName())).append("*")
|
final StringBuilder builder = new StringBuilder(Icons.DANGEROUS).append(" *Attention. MergeRequest conflict!*")
|
||||||
.append(Icons.HR)
|
.append(Icons.HR)
|
||||||
.append(link(notify.getTitle(), notify.getUrl()));
|
.append(escapeMarkdown(notify.getTitle()))
|
||||||
|
.append(Icons.HR)
|
||||||
|
.append(Icons.PROJECT).append(": ").append(escapeMarkdown(notify.getProjectName())).append("\n")
|
||||||
|
.append(Icons.TREE).append(": ").append(escapeMarkdown(notify.getSourceBranch()));
|
||||||
|
|
||||||
final String notifyMessage = builder.toString();
|
final String notifyMessage = builder.toString();
|
||||||
return boxAnswer(notifyMessage);
|
return boxAnswer(
|
||||||
|
notifyMessage,
|
||||||
|
inlineKeyBoard(
|
||||||
|
simpleLine(
|
||||||
|
simpleButton(Icons.VIEW, DELETE_MESSAGE),
|
||||||
|
urlButton(Icons.LINK, notify.getUrl()),
|
||||||
|
simpleButton(Icons.DISABLE_NOTIFY, "[" + BUTTON_ARG_DISABLE_NOTIFY_MR_ID + ":" + notify.getMrId() + ";" + BUTTON_ARG_CONFIRMATION + ":" + BUTTON_VALUE_FALSE + "]")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -0,0 +1,50 @@
|
|||||||
|
package dev.struchkov.bot.gitlab.telegram.service.notify;
|
||||||
|
|
||||||
|
import dev.struchkov.bot.gitlab.context.domain.notify.mergerequest.ConflictResolveMrNotify;
|
||||||
|
import dev.struchkov.bot.gitlab.context.utils.Icons;
|
||||||
|
import dev.struchkov.godfather.main.domain.BoxAnswer;
|
||||||
|
import org.springframework.stereotype.Component;
|
||||||
|
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_CONFIRMATION;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_ARG_DISABLE_NOTIFY_MR_ID;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.Const.BUTTON_VALUE_FALSE;
|
||||||
|
import static dev.struchkov.bot.gitlab.telegram.utils.UnitName.DELETE_MESSAGE;
|
||||||
|
import static dev.struchkov.godfather.main.domain.BoxAnswer.boxAnswer;
|
||||||
|
import static dev.struchkov.godfather.main.domain.keyboard.button.SimpleButton.simpleButton;
|
||||||
|
import static dev.struchkov.godfather.main.domain.keyboard.simple.SimpleKeyBoardLine.simpleLine;
|
||||||
|
import static dev.struchkov.godfather.telegram.domain.keyboard.InlineKeyBoard.inlineKeyBoard;
|
||||||
|
import static dev.struchkov.godfather.telegram.domain.keyboard.button.UrlButton.urlButton;
|
||||||
|
import static dev.struchkov.haiti.utils.Strings.escapeMarkdown;
|
||||||
|
|
||||||
|
@Component
|
||||||
|
public class ConflictResolvePrNotifyGenerator implements NotifyBoxAnswerGenerator<ConflictResolveMrNotify> {
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public BoxAnswer generate(ConflictResolveMrNotify notify) {
|
||||||
|
|
||||||
|
final StringBuilder builder = new StringBuilder(Icons.GREEN_CIRCLE).append(" *Merge request conflict resolved!*")
|
||||||
|
.append(Icons.HR)
|
||||||
|
.append(escapeMarkdown(notify.getTitle()))
|
||||||
|
.append(Icons.HR)
|
||||||
|
.append(Icons.PROJECT).append(": ").append(escapeMarkdown(notify.getProjectName())).append("\n")
|
||||||
|
.append(Icons.TREE).append(": ").append(escapeMarkdown(notify.getSourceBranch()));
|
||||||
|
|
||||||
|
final String notifyMessage = builder.toString();
|
||||||
|
return boxAnswer(
|
||||||
|
notifyMessage,
|
||||||
|
inlineKeyBoard(
|
||||||
|
simpleLine(
|
||||||
|
simpleButton(Icons.VIEW, DELETE_MESSAGE),
|
||||||
|
urlButton(Icons.LINK, notify.getUrl()),
|
||||||
|
simpleButton(Icons.DISABLE_NOTIFY, "[" + BUTTON_ARG_DISABLE_NOTIFY_MR_ID + ":" + notify.getMrId() + ";" + BUTTON_ARG_CONFIRMATION + ":" + BUTTON_VALUE_FALSE + "]")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getNotifyType() {
|
||||||
|
return ConflictResolveMrNotify.TYPE;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -79,7 +79,7 @@ public class DisableNotifyMrUnit {
|
|||||||
.orElseThrow();
|
.orElseThrow();
|
||||||
|
|
||||||
if (confirmation) {
|
if (confirmation) {
|
||||||
mergeRequestsService.disableNotify(mrId);
|
mergeRequestsService.notification(false, mrId);
|
||||||
scheduledExecutorService.schedule(() -> telegramSending.deleteMessage(mail.getPersonId(), clickButton.getMessageId()), 5, TimeUnit.SECONDS);
|
scheduledExecutorService.schedule(() -> telegramSending.deleteMessage(mail.getPersonId(), clickButton.getMessageId()), 5, TimeUnit.SECONDS);
|
||||||
return replaceBoxAnswer(SUCCESSFULLY_DISABLED);
|
return replaceBoxAnswer(SUCCESSFULLY_DISABLED);
|
||||||
} else {
|
} else {
|
||||||
|
@ -2,6 +2,7 @@ package dev.struchkov.bot.gitlab.telegram.unit.command;
|
|||||||
|
|
||||||
import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
|
import dev.struchkov.bot.gitlab.context.domain.PersonInformation;
|
||||||
import dev.struchkov.bot.gitlab.context.service.AppSettingService;
|
import dev.struchkov.bot.gitlab.context.service.AppSettingService;
|
||||||
|
import dev.struchkov.bot.gitlab.context.service.MergeRequestsService;
|
||||||
import dev.struchkov.bot.gitlab.context.service.ProjectService;
|
import dev.struchkov.bot.gitlab.context.service.ProjectService;
|
||||||
import dev.struchkov.bot.gitlab.context.utils.Icons;
|
import dev.struchkov.bot.gitlab.context.utils.Icons;
|
||||||
import dev.struchkov.bot.gitlab.telegram.utils.UnitName;
|
import dev.struchkov.bot.gitlab.telegram.utils.UnitName;
|
||||||
@ -28,6 +29,7 @@ import static dev.struchkov.godfather.main.domain.BoxAnswer.replaceBoxAnswer;
|
|||||||
public class EnableProjectNotify {
|
public class EnableProjectNotify {
|
||||||
|
|
||||||
private final ProjectService projectService;
|
private final ProjectService projectService;
|
||||||
|
private final MergeRequestsService mergeRequestsService;
|
||||||
|
|
||||||
private final AppSettingService settingService;
|
private final AppSettingService settingService;
|
||||||
private final PersonInformation personInformation;
|
private final PersonInformation personInformation;
|
||||||
@ -59,6 +61,7 @@ public class EnableProjectNotify {
|
|||||||
final Set<Long> setProjectId = Set.of(projectId);
|
final Set<Long> setProjectId = Set.of(projectId);
|
||||||
projectService.processing(true, setProjectId);
|
projectService.processing(true, setProjectId);
|
||||||
projectService.notification(true, setProjectId);
|
projectService.notification(true, setProjectId);
|
||||||
|
mergeRequestsService.notificationByProjectId(true, setProjectId);
|
||||||
return replaceBoxAnswer(mail.getId(), Icons.GOOD + " you will now receive notifications!");
|
return replaceBoxAnswer(mail.getId(), Icons.GOOD + " you will now receive notifications!");
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
Loading…
Reference in New Issue
Block a user