Hemmäňize salam! Geçen hepde başlanan meseläniň üstünde işlemegi dowam etdirýäris .
JRTB-5 durmuşa geçirýäris
Indi JavaRush-dan käbir makalalar toparyna ýazylmak üçin buýruk goşmaly. Muny nädip etmeli? Iň ýönekeý ssenariýany ýerine ýetireris. Topar ID-si bilen elýeterliligimiz sebäpli, ony geçirmek üçin ulanyja mätäç. Munuň üçin ulanyjy iki ýoluň birinde işleýän / addGroupSub GROUP_ID buýrugyny girizer: diňe buýrugyň özi gelse: / addGroupSub , ähli toparlaryň sanawy we şahsyýetnamalary jogap hökmünde iberilýär. Soňra ulanyjy zerur topar ID-ni saýlap biler we bu buýrukda haýyşyň ikinji wersiýasyny döredip biler: / addGroupSub GROUP_ID - soň bu ulanyjy bilen bu toparyň ýazgysy bolar. Geljekde has gowy edip bileris diýip pikir edýärin. Biziň maksadymyz, ajaýyp ulanyjy tejribesini däl-de, ösüşi görkezmekdir (aýtmaga utanýaryn, ýöne rus dilinde bu manyny aňladýan termini bilemok). Applicationhli programmanyň üstünden geçýän funksiýany dogry goşmak üçin (biziň ýagdaýymyzda, telegram bot müşderisinden maglumat bazasyna çenli) belli bir derejede başlamaly. Muny maglumatlar bazasy tarapyndan ederis.Maglumat bazasyna täze göçürme goşmak
Ilki bilen täze maglumatlar bazasynyň göçüşini we ulanyjy toparyna abuna maglumatlaryny JR-de ýatda saklamak ukybyny goşmak. Munuň nähili bolmalydygyny ýada salmak üçin “ Taslamany meýilleşdirmek: ýedi gezek ölçäň ” makalasyna gaýdyp geliň . Ikinji suratda maglumatlar bazasynyň takmynan diagrammasy bar. Topar maglumatyny saklamak üçin tablisa goşmaly:- JavaRush-daky topar ID-si hem biziň şahsyýetimiz bolar. Biz olara ynanýarys we bu şahsyýetnamalaryň özboluşlydygyna ynanýarys;
- ady - suratlarymyzda ady - toparyň resmi däl ady; ýagny JavaRush web sahypasynda görýänlerimiz;
- last_article_id - we bu gyzykly meýdan. Makalanyň soňky şahsyýetnamasyny bot eýýäm abonentlerine iberen bu toparda saklar. Bu ugurdan peýdalanyp, täze makalalary gözlemegiň mehanizmi işlär. Täze abonentler ulanyjy ýazylmazdan ozal çap edilen makalalary almazlar: diňe topara ýazylandan soň çap edilen makalalar.
V00002__created_groupsub_many_to_many.sql:
-- add PRIMARY KEY FOR tg_user
ALTER TABLE tg_user ADD PRIMARY KEY (chat_id);
-- ensure that the tables with these names are removed before creating a new one.
DROP TABLE IF EXISTS group_sub;
DROP TABLE IF EXISTS group_x_user;
CREATE TABLE group_sub (
id INT,
title VARCHAR(100),
last_article_id INT,
PRIMARY KEY (id)
);
CREATE TABLE group_x_user (
group_sub_id INT NOT NULL,
user_id VARCHAR(100) NOT NULL,
FOREIGN KEY (user_id) REFERENCES tg_user(chat_id),
FOREIGN KEY (group_sub_id) REFERENCES group_sub(id),
UNIQUE(user_id, group_sub_id)
);
Ilki bilen köne tablisany üýtgedýändigimi bellemelidiris - oňa esasy açary goşýaryn. Şol wagt nämüçindir muny küýsedim, ýöne indi MySQL maňa gorup_x_user tablisasy üçin Daşary ýurt açary goşmaga mümkinçilik bermedi we bu göçümiň bir bölegi hökmünde maglumat bazasyny täzeledim. Möhüm tarapyna üns bermegiňizi haýyş edýäris. Maglumatlar bazasyny üýtgetmek edil şu görnüşde edilmeli - zerur zat täze göçümde, ýöne eýýäm goýberilen migrasiýany täzelemek bilen däl. Hawa, biziň ýagdaýymyzda hiç zat bolmaz, sebäbi bu synag taslamasy we biz onuň diňe bir ýerde ýerleşdirilendigini bilýäris, ýöne bu nädogry çemeleşme bolar. Emma hemme zadyň dogry bolmagyny isleýäris. Indiki tablisalary döretmezden ozal pozulýar. Bu näme üçin? Belli bir ýagdaýda maglumatlar bazasynda şeýle atlar bilen tablisalar bar bolsa, göç ediliş şowsuz bolmaz we garaşylşy ýaly işlär. Soň bolsa iki tablisany goşýarys. Hemme zat isleýşimiz ýalydy. Indi arzamyzy başlamaly. Hemme zat başlasa we bozulmasa, göçürme ýazylýar. Muny iki gezek barlamak üçin maglumatlar bazasyna girýäris: a) şeýle tablisalaryň peýda bolandygyny; b) uçuş ýolunyň tehniki tablisasynda täze ýazgy bar. Bu migrasiýa işini tamamlaýar, geliň ammarlara geçeliň.
Ammar gatlagyny goşmak
“Spring Boot Data” -iň kömegi bilen bu ýerde hemme zat gaty ýönekeý: “GroupSub” guramasyny goşmaly, “TelegramUser” -i biraz täzelemeli we boş diýen ýaly “GroupSubRepository” goşmaly: “GroupSub” guramasyny TelegramUser bilen bir paketde goşýarys:package com.github.javarushcommunity.jrtb.repository.entity;
import lombok.Data;
import lombok.EqualsAndHashCode;
import javax.persistence.*;
import java.util.ArrayList;
import java.util.List;
import static java.util.Objects.isNull;
@Data
@Entity
@Table(name = "group_sub")
@EqualsAndHashCode
public class GroupSub {
@Id
private Integer id;
@Column(name = "title")
private String title;
@Column(name = "last_article_id")
private Integer lastArticleId;
@ManyToMany(fetch = FetchType.EAGER)
@JoinTable(
name = "group_x_user",
joinColumns = @JoinColumn(name = "group_sub_id"),
inverseJoinColumns = @JoinColumn(name = "user_id")
)
private List<TelegramUser> users;
public void addUser(TelegramUser telegramUser) {
if (isNull(users)) {
users = new ArrayList<>();
}
users.add(telegramUser);
}
}
Bellemeli bir zat, topara ýazylan ähli ulanyjylaryň ýygyndysyny öz içine alýan goşmaça ulanyjylar meýdançamyz bar. Iki düşündiriş - ManyToMany we JoinTable - munuň üçin zerur zat. TelegramUser üçin şol bir meýdany goşmaly:
@ManyToMany(mappedBy = "users", fetch = FetchType.EAGER)
private List<GroupSub> groupSubs;
Bu meýdan, GroupSub guramasynda ýazylan birleşmeleri ulanýar. Aslynda, GroupSub üçin ammar synpymyz GroupSubRepository :
package com.github.javarushcommunity.jrtb.repository;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;
/**
* {@link Repository} for {@link GroupSub} entity.
*/
@Repository
public interface GroupSubRepository extends JpaRepository<GroupSub, Integer> {
}
Bu etapda bize goşmaça usullar gerek däl: JpaRepository ata-babasynda durmuşa geçirilenler bize ýeterlikdir. Geliň, TelegramUserRepositoryIT-de köp adamyň işleýändigini barlaýan synag ýazalyň. Synagyň pikiri, sql skriptiniň üsti bilen maglumatlar bazasyna her ulanyjy üçin 5 topar abunalyk goşarys, bu ulanyjyny şahsyýetnamasy bilen alarys we şol toparlary alandygymyzy we birmeňzeş bahalary alarys. Muny nädip etmeli? Maglumatlara hasaplaýjy goýup bilersiňiz, soňundan barlap bileris. Ine, bäşGroupSubsForUser.sql skripti:
INSERT INTO tg_user VALUES (1, 1);
INSERT INTO group_sub VALUES
(1, 'g1', 1),
(2, 'g2', 2),
(3, 'g3', 3),
(4, 'g4', 4),
(5, 'g5', 5);
INSERT INTO group_x_user VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 1),
(5, 1);
Synagyň özi:
@Sql(scripts = {"/sql/clearDbs.sql", "/sql/fiveGroupSubsForUser.sql"})
@Test
public void shouldProperlyGetAllGroupSubsForUser() {
//when
Optional<TelegramUser> userFromDB = telegramUserRepository.findById("1");
//then
Assertions.assertTrue(userFromDB.isPresent());
List<GroupSub> groupSubs = userFromDB.get().getGroupSubs();
for (int i = 0; i < groupSubs.size(); i++) {
Assertions.assertEquals(String.format("g%s", (i + 1)), groupSubs.get(i).getTitle());
Assertions.assertEquals(i + 1, groupSubs.get(i).getId());
Assertions.assertEquals(i + 1, groupSubs.get(i).getLastArticleId());
}
}
Indi “GroupSub” guramasy üçin şol bir many synagyny goşalyň. Munuň üçin geliň, GroupSubRepositoryIT bilen bir paketde synag synp toparySubRepositoryIT döredeliň :
package com.github.javarushcommunity.jrtb.repository;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase;
import org.springframework.boot.test.autoconfigure.orm.jpa.DataJpaTest;
import org.springframework.test.context.ActiveProfiles;
import org.springframework.test.context.jdbc.Sql;
import java.util.List;
import java.util.Optional;
import static org.springframework.boot.test.autoconfigure.jdbc.AutoConfigureTestDatabase.Replace.NONE;
/**
* Integration-level testing for {@link GroupSubRepository}.
*/
@ActiveProfiles("test")
@DataJpaTest
@AutoConfigureTestDatabase(replace = NONE)
public class GroupSubRepositoryIT {
@Autowired
private GroupSubRepository groupSubRepository;
@Sql(scripts = {"/sql/clearDbs.sql", "/sql/fiveUsersForGroupSub.sql"})
@Test
public void shouldProperlyGetAllUsersForGroupSub() {
//when
Optional<GroupSub> groupSubFromDB = groupSubRepository.findById(1);
//then
Assertions.assertTrue(groupSubFromDB.isPresent());
Assertions.assertEquals(1, groupSubFromDB.get().getId());
List<TelegramUser> users = groupSubFromDB.get().getUsers();
for(int i=0; i<users.size(); i++) {
Assertions.assertEquals(String.valueOf(i + 1), users.get(i).getChatId());
Assertions.assertTrue(users.get(i).isActive());
}
}
}
Theitirilen bäşUsersForGroupSub.sql skripti:
INSERT INTO tg_user VALUES
(1, 1),
(2, 1),
(3, 1),
(4, 1),
(5, 1);
INSERT INTO group_sub VALUES (1, 'g1', 1);
INSERT INTO group_x_user VALUES
(1, 1),
(1, 2),
(1, 3),
(1, 4),
(1, 5);
Bu pursatda ammar bilen işiň bir bölegi tamamlandy diýip hasaplamak bolar. Indi hyzmat gatlagyny ýazalyň.
GroupSubService ýazýarys
Abunalar toparlary bilen işlemek üçin bu etapda diňe olary tygşytlamagy başarmaly, şonuň üçin hiç hili mesele ýok: GroupSubService hyzmatyny we beýleki hyzmatlary - hyzmaty öz içine alýan bukjada GroupSubServiceImpl-i durmuşa geçirýäris:package com.github.javarushcommunity.jrtb.service;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
/**
* Service for manipulating with {@link GroupSub}.
*/
public interface GroupSubService {
GroupSub save(String chatId, GroupDiscussionInfo groupDiscussionInfo);
}
Ony durmuşa geçirmek:
package com.github.javarushcommunity.jrtb.service;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.repository.GroupSubRepository;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import javax.ws.rs.NotFoundException;
import java.util.Optional;
@Service
public class GroupSubServiceImpl implements GroupSubService {
private final GroupSubRepository groupSubRepository;
private final TelegramUserService telegramUserService;
@Autowired
public GroupSubServiceImpl(GroupSubRepository groupSubRepository, TelegramUserService telegramUserService) {
this.groupSubRepository = groupSubRepository;
this.telegramUserService = telegramUserService;
}
@Override
public GroupSub save(String chatId, GroupDiscussionInfo groupDiscussionInfo) {
TelegramUser telegramUser = telegramUserService.findByChatId(chatId).orElseThrow(NotFoundException::new);
//TODO add exception handling
GroupSub groupSub;
Optional<GroupSub> groupSubFromDB = groupSubRepository.findById(groupDiscussionInfo.getId());
if(groupSubFromDB.isPresent()) {
groupSub = groupSubFromDB.get();
Optional<TelegramUser> first = groupSub.getUsers().stream()
.filter(it -> it.getChatId().equalsIgnoreCase(chatId))
.findFirst();
if(first.isEmpty()) {
groupSub.addUser(telegramUser);
}
} else {
groupSub = new GroupSub();
groupSub.addUser(telegramUser);
groupSub.setId(groupDiscussionInfo.getId());
groupSub.setTitle(groupDiscussionInfo.getTitle());
}
return groupSubRepository.save(groupSub);
}
}
Bahar maglumatlarynyň dogry işlemegi we köp sanly ýazgylaryň döredilmegi üçin ulanyjyny döredýän abuna toparymyz üçin maglumatlar bazamyzdan almaly we ony GroupSub obýektine goşmaly. Şeýlelik bilen, bu abuna ýazgyny tygşytlamak üçin geçirenimizde, group_x_user tablisasynyň üsti bilen hem baglanyşyk dörediler. Şeýle abunalyk topary eýýäm döredilen we oňa başga bir ulanyjy goşmaly bir ýagdaý bolup biler. Munuň üçin ilki bilen topar ID-ni maglumatlar bazasyndan alýarys we ýazgy bar bolsa, onuň bilen işleýäris, ýok bolsa täzesini döredýäris. TelegramUser bilen işlemek üçin SOLID ýörelgeleriniň iň soňkusyny ýerine ýetirmek üçin TelegramUserService ulanýandygymyzy bellemelidiris. Häzirki wagtda şahsyýetnama boýunça ýazgy tapmasak, diňe kadadan çykma goýýaryn. Häzir hiç hili işlenmeýär: muny iň soňunda, MVP-den öň ederis. GroupSubServiceTest synpy üçin iki birlik synagyny ýazalyň . Haýsylary gerek? Tygşytlaýyş usulynyň “GroupSubRepository” -da çagyryljakdygyna we bir ulanyjyly bir guramanyň “GroupSub” -a geçiriljekdigini - berlen ID ulanyp, TelegramUserService-i bize gaýtaryp berjekdigine ynanasym gelýär. Ikinji wariant, şol bir ID bilen bir topar eýýäm maglumatlar bazasynda bolsa we bu toparyň eýýäm bir ulanyjysy bar bolsa, bu topara başga bir ulanyjynyň goşuljakdygyny we bu obýektiň ýatda saklanjakdygyny barlamaly. Ine, ýerine ýetiriş:
package com.github.javarushcommunity.jrtb.service;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.repository.GroupSubRepository;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import org.junit.jupiter.api.BeforeEach;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import java.util.Optional;
@DisplayName("Unit-level testing for GroupSubService")
public class GroupSubServiceTest {
private GroupSubService groupSubService;
private GroupSubRepository groupSubRepository;
private TelegramUser newUser;
private final static String CHAT_ID = "1";
@BeforeEach
public void init() {
TelegramUserService telegramUserService = Mockito.mock(TelegramUserService.class);
groupSubRepository = Mockito.mock(GroupSubRepository.class);
groupSubService = new GroupSubServiceImpl(groupSubRepository, telegramUserService);
newUser = new TelegramUser();
newUser.setActive(true);
newUser.setChatId(CHAT_ID);
Mockito.when(telegramUserService.findByChatId(CHAT_ID)).thenReturn(Optional.of(newUser));
}
@Test
public void shouldProperlySaveGroup() {
//given
GroupDiscussionInfo groupDiscussionInfo = new GroupDiscussionInfo();
groupDiscussionInfo.setId(1);
groupDiscussionInfo.setTitle("g1");
GroupSub expectedGroupSub = new GroupSub();
expectedGroupSub.setId(groupDiscussionInfo.getId());
expectedGroupSub.setTitle(groupDiscussionInfo.getTitle());
expectedGroupSub.addUser(newUser);
//when
groupSubService.save(CHAT_ID, groupDiscussionInfo);
//then
Mockito.verify(groupSubRepository).save(expectedGroupSub);
}
@Test
public void shouldProperlyAddUserToExistingGroup() {
//given
TelegramUser oldTelegramUser = new TelegramUser();
oldTelegramUser.setChatId("2");
oldTelegramUser.setActive(true);
GroupDiscussionInfo groupDiscussionInfo = new GroupDiscussionInfo();
groupDiscussionInfo.setId(1);
groupDiscussionInfo.setTitle("g1");
GroupSub groupFromDB = new GroupSub();
groupFromDB.setId(groupDiscussionInfo.getId());
groupFromDB.setTitle(groupDiscussionInfo.getTitle());
groupFromDB.addUser(oldTelegramUser);
Mockito.when(groupSubRepository.findById(groupDiscussionInfo.getId())).thenReturn(Optional.of(groupFromDB));
GroupSub expectedGroupSub = new GroupSub();
expectedGroupSub.setId(groupDiscussionInfo.getId());
expectedGroupSub.setTitle(groupDiscussionInfo.getTitle());
expectedGroupSub.addUser(oldTelegramUser);
expectedGroupSub.addUser(newUser);
//when
groupSubService.save(CHAT_ID, groupDiscussionInfo);
//then
Mockito.verify(groupSubRepository).findById(groupDiscussionInfo.getId());
Mockito.verify(groupSubRepository).save(expectedGroupSub);
}
}
Şeýle hem, init () usulyny “BeforeEach” düşündirişi bilen goşdum . Şeýlelik bilen, adatça her synag başlamazdan ozal ýerine ýetiriljek usul döredýärler we ähli synaglar üçin umumy logikany goýmak mümkin. Biziň ýagdaýymyzda, bu synpyň ähli synaglary üçin TelegramUserService-ny birmeňzeş gulplamaly, şonuň üçin bu logikany umumy usula geçirmegiň manysy bar. Bu ýerde iki sany mokito dizaýny bar:
-
Mockito . _ _ _ _ _ _ _ _ Bu mockitonyň iň möhüm funksiýasy diýen ýaly - masgaralaýjy zady zerur zatlary yzyna gaýtarmaga mejbur etmek;
-
Mockito.verify (o1) .m1 (a1) - a1 argumenti bilen o1 obýektde m1 usulynyň çagyrylandygyny tassyklaýan . Elbetde, tygşytlamak usulynyň yzyna gaýtarylan obýektini ulanmak mümkin boldy, ýöne mümkin bolan başga bir usuly görkezip, ony birneme çylşyrymlaşdyrmagy makul bildim. Haçan peýdaly bolup biler? Masgaralaýyş synplarynyň usullary ýitirilen ýagdaýlarda. Soň Mockito.verify bolmasa iş bolmaz)))
/ AddGroupSub buýrugyny dörediň
Bu ýerde aşakdaky logikany ýerine ýetirmeli: eger hiç hili mazmuny bolmazdan diňe bir buýruk alsak, ulanyja kömek edýäris we bot-a zerur maglumatlary geçirip biler ýaly şahsyýetnamalary bilen ähli toparlaryň sanawyny berýäris. Ulanyjy başga bir söz (ler) bilen botda buýruk iberen bolsa, şol ID bilen bir topar tapyň ýa-da beýle toparyň ýokdugyny ýazyň. Eneimize täze bir baha goşalyň - CommandName:ADD_GROUP_SUB("/addgroupsub")
Maglumat bazasyndan telegram botyna geçeliň - buýruk bukjasynda AddGroupSubCommand synpyny döredeliň:
package com.github.javarushcommunity.jrtb.command;
import com.github.javarushcommunity.jrtb.javarushclient.JavaRushGroupClient;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupDiscussionInfo;
import com.github.javarushcommunity.jrtb.javarushclient.dto.GroupRequestArgs;
import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.service.GroupSubService;
import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import org.telegram.telegrambots.meta.api.objects.Update;
import java.util.stream.Collectors;
import static com.github.javarushcommunity.jrtb.command.CommandName.ADD_GROUP_SUB;
import static com.github.javarushcommunity.jrtb.command.CommandUtils.getChatId;
import static com.github.javarushcommunity.jrtb.command.CommandUtils.getMessage;
import static java.util.Objects.isNull;
import static org.apache.commons.lang3.StringUtils.SPACE;
import static org.apache.commons.lang3.StringUtils.isNumeric;
/**
* Add Group subscription {@link Command}.
*/
public class AddGroupSubCommand implements Command {
private final SendBotMessageService sendBotMessageService;
private final JavaRushGroupClient javaRushGroupClient;
private final GroupSubService groupSubService;
public AddGroupSubCommand(SendBotMessageService sendBotMessageService, JavaRushGroupClient javaRushGroupClient,
GroupSubService groupSubService) {
this.sendBotMessageService = sendBotMessageService;
this.javaRushGroupClient = javaRushGroupClient;
this.groupSubService = groupSubService;
}
@Override
public void execute(Update update) {
if (getMessage(update).equalsIgnoreCase(ADD_GROUP_SUB.getCommandName())) {
sendGroupIdList(getChatId(update));
return;
}
String groupId = getMessage(update).split(SPACE)[1];
String chatId = getChatId(update);
if (isNumeric(groupId)) {
GroupDiscussionInfo groupById = javaRushGroupClient.getGroupById(Integer.parseInt(groupId));
if (isNull(groupById.getId())) {
sendGroupNotFound(chatId, groupId);
}
GroupSub savedGroupSub = groupSubService.save(chatId, groupById);
sendBotMessageService.sendMessage(chatId, "Подписал на группу " + savedGroupSub.getTitle());
} else {
sendGroupNotFound(chatId, groupId);
}
}
private void sendGroupNotFound(String chatId, String groupId) {
String groupNotFoundMessage = "Нет группы с ID = \"%s\"";
sendBotMessageService.sendMessage(chatId, String.format(groupNotFoundMessage, groupId));
}
private void sendGroupIdList(String chatId) {
String groupIds = javaRushGroupClient.getGroupList(GroupRequestArgs.builder().build()).stream()
.map(group -> String.format("%s - %s \n", group.getTitle(), group.getId()))
.collect(Collectors.joining());
String message = "Whatбы подписаться на группу - передай комадну вместе с ID группы. \n" +
"Например: /addGroupSub 16. \n\n" +
"я подготовил список всех групп - выберай Howую хочешь :) \n\n" +
"Name группы - ID группы \n\n" +
"%s";
sendBotMessageService.sendMessage(chatId, String.format(message, groupIds));
}
}
Bu synp apache-commons kitaphanasyndan isNumeric usulyny ulanýar , geliň ony ýadymyza goşalyň:
<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>${apache.commons.version}</version>
</dependency>
Sypatlar blokynda:
<apache.commons.version>3.11</apache.commons.version>
Bu logikanyň hemmesi synpda. Dykgat bilen okaň. Soraglaryňyz / teklipleriňiz bar bolsa teswirlerde ýazyň. Ondan soň buýruk kartamyzda CommandContainer-e buýruk goşmaly:
.put(ADD_GROUP_SUB.getCommandName(), new AddGroupSubCommand(sendBotMessageService, javaRushGroupClient, groupSubService))
Bu topar üçin hemme zat. Bu funksiýany nädip synap görmek isleýärin, ýöne şu wagta çenli diňe maglumatlar bazasynda seredip bilerin. Üçünji bölümde, ulanyjynyň abuna ýazylan toparlarynyň sanawyny görmek üçin JRTB-6-dan üýtgeşmeler goşaryn. Indi bularyň hemmesini barlamak gowy bolardy. Munuň üçin Telegramdaky ähli çäreleri ýerine ýetireris we maglumat bazasynda barlarys. Synaglary ýazanymyz üçin hemme zat gowy bolmaly. Makala eýýäm gaty uzyn, şonuň üçin AddGroupSubCommand üçin synag ýazarys we ýatdan çykarmazlyk üçin kodda TODO goşarys.
GO TO FULL VERSION