JavaRush /Java Blog /Random-TK /Makalalar toparyna ýazylmak mümkinçiligimizi goşýarys. (2...

Makalalar toparyna ýazylmak mümkinçiligimizi goşýarys. (2-nji bölüm) - "A-dan Z-a çenli Java taslamasy"

Toparda çap edildi
Hemmäňize salam! Geçen hepde başlanan meseläniň üstünde işlemegi dowam etdirýäris ."Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  2-nji bölüm

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.
Şeýle hem, toparlaryň we ulanyjylaryň tablisasynyň arasynda köp-köp gatnaşyklarymyz bolar, sebäbi her bir ulanyjynyň köp sanly abuna ýazylmagy mümkin (bir-birden köp) we her topara abuna ýazylanda köp ulanyjy bolup biler (bir-birden köp, diňe beýleki tarapynda). Görnüşi ýaly, bu köp adam bolar. Soraglary bolanlar üçin maglumatlar bazasyndaky makalalary gözden geçiriň. Hawa, ýakyn wagtda Telegram kanalynda ýazgy döretmegi meýilleşdirýärin, şol ýerde maglumatlar bazasyndaky ähli makalalary bir ýere jemlärin. Ikinji maglumat bazasynyň göçüşi şeýle bolar.
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)))

Synaglaryň ýazylmalydygy we olaryň köpüsiniň ýazylmalydygy baradaky pikiri dowam etdirýäris. Indiki etap telegram bot topary bilen işleýär.

/ 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.

Netijeler

Bu makalada maglumatlar bazasyndan başlap, bot ulanýan müşderi bilen işlemek bilen gutarýan ähli programmanyň üsti bilen funksiýa goşmak işine syn etdik. Adatça şeýle meseleler taslama düşünmäge we onuň manysyna düşünmäge kömek edýär. Onuň nähili işleýändigine düşüniň. Bu günler mowzuklar aňsat däl, şonuň üçin utanmaň: soraglaryňyzy teswirlere ýazyň, men olara jogap bermäge synanyşaryn. Taslamany haladyňyzmy? Github-da ýyldyz beriň : şeýlelik bilen olaryň taslama bilen gyzyklanýandyklary belli bolar we men begenerin. Olaryň aýdyşy ýaly, ussat işine baha berlende hemişe hoşal bolýar. Kod STEP_6-nyň üç bölegini öz içine alar we bu makaladan öň elýeterli bolar. Bu barada nädip bilmeli? Bu aňsat - telegram kanalyna goşulyň , şol ýerde telegram boty baradaky makalalarym hakda ähli maglumatlary çap edýärin. Okanyňyz üçin sag boluň! 3-nji bölüm eýýäm şu ýerde .

Tapgyryň ähli materiallarynyň sanawy bu makalanyň başynda.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION