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

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

Toparda çap edildi
Ýene-de salam. Bu, STEP_6-dan soňky makala, onda JRTB-6 meselesine funksiýa goşmak barada gürleşeris . Öňki iki makalada ( 1-nji bölüm , 2-nji bölüm ) size zerur zatlaryň hemmesini diýen ýaly taýýarladyk. Bu bölüm prosesiň iň ýokary nokady. Bu makalalaryň tapgyryny başdan şu wagta çenli okan her bir adama - uly hormat. Bu, uly iş tapmak üçin ýeterlik höwesiňiziň bardygyny aňladýar. Indi işe gireliň."Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm

JRTB-6 durmuşa geçirýäris

Bu gezek meseläni telegramma botunyň gapdalyndan ýerine ýetireris, sebäbi maglumat bazasyny täzelemek boýunça işler tamamlandy, maglumatlar bazasynyň guramalary düzüldi we işe taýyn. CommandName - LIST_GROUP_SUB -a täze baha goşalyň :
LIST_GROUP_SUB("/listGroupSub");
“ListGroupSubCommand” buýrugyny döredeliň :
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import com.github.javarushcommunity.jrtb.service.TelegramUserService;
import org.telegram.telegrambots.meta.api.objects.Update;

import javax.ws.rs.NotFoundException;
import java.util.stream.Collectors;

import static com.github.javarushcommunity.jrtb.command.CommandUtils.getChatId;

/**
* {@link Command} for getting list of {@link GroupSub}.
*/
public class ListGroupSubCommand implements Command {

   private final SendBotMessageService sendBotMessageService;
   private final TelegramUserService telegramUserService;

   public ListGroupSubCommand(SendBotMessageService sendBotMessageService, TelegramUserService telegramUserService) {
       this.sendBotMessageService = sendBotMessageService;
       this.telegramUserService = telegramUserService;
   }

   @Override
   public void execute(Update update) {
       //todo add exception handling
       TelegramUser telegramUser = telegramUserService.findByChatId(getChatId(update))
               .orElseThrow(NotFoundException::new);

       String message = "Я нашел все подписки на группы: \n\n";
       String collectedGroups = telegramUser.getGroupSubs().stream()
               .map(it -> "Группа: " + it.getTitle() + " , ID = " + it.getId() + " \n")
               .collect(Collectors.joining());

       sendBotMessageService.sendMessage(telegramUser.getChatId(), message + collectedGroups);
   }
}
Bu ýerde hemme zat mümkin boldugyça ýönekeý - ulanyjyny bar bolan chat_id-den peýdalanýarys we toparlara ýazylan ähli ýazgylary obýektinde ýygnalar. Muny ikinji bölümde gurduk. Againene-de, amal wagtynda ýüze çykyp biljek kadadan çykmalary ýatdan çykarmazlyk üçin // todo goşdum. Indiki ädim, oňa täze buýruk goşmak bilen CommandContainer-i täzelemek :
put(LIST_GROUP_SUB.getCommandName(), new GroupSubListCommand(sendBotMessageService, telegramUserService))
Munuň özi esasan: indi has köp synag ýazmaly, / kömek buýrugyny täzelemeli (täze buýruklar üçin düşündiriş goşmaly) we Telegram arkaly täze funksiýany barlamaly. ListGroupSubCommand üçin synag ýazalyň . Buýrugyň logikasy adaty däldigi sebäpli, öňküsi ýaly AbstractCommandTest synpyna bagly bolmazdan synag ýazarys :
package com.github.javarushcommunity.jrtb.command;

import com.github.javarushcommunity.jrtb.repository.entity.GroupSub;
import com.github.javarushcommunity.jrtb.repository.entity.TelegramUser;
import com.github.javarushcommunity.jrtb.service.SendBotMessageService;
import com.github.javarushcommunity.jrtb.service.TelegramUserService;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;
import org.mockito.Mockito;
import org.telegram.telegrambots.meta.api.objects.Message;
import org.telegram.telegrambots.meta.api.objects.Update;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

import static com.github.javarushcommunity.jrtb.command.CommandName.LIST_GROUP_SUB;

@DisplayName("Unit-level testing for ListGroupSubCommand")
public class ListGroupSubCommandTest {

   @Test
   public void shouldProperlyShowsListGroupSub() {
       //given
       TelegramUser telegramUser = new TelegramUser();
       telegramUser.setActive(true);
       telegramUser.setChatId("1");

       List<GroupSub> groupSubList = new ArrayList<>();
       groupSubList.add(populateGroupSub(1, "gs1"));
       groupSubList.add(populateGroupSub(2, "gs2"));
       groupSubList.add(populateGroupSub(3, "gs3"));
       groupSubList.add(populateGroupSub(4, "gs4"));

       telegramUser.setGroupSubs(groupSubList);

       SendBotMessageService sendBotMessageService = Mockito.mock(SendBotMessageService.class);
       TelegramUserService telegramUserService = Mockito.mock(TelegramUserService.class);

       Mockito.when(telegramUserService.findByChatId(telegramUser.getChatId())).thenReturn(Optional.of(telegramUser));

       ListGroupSubCommand command = new ListGroupSubCommand(sendBotMessageService, telegramUserService);

       Update update = new Update();
       Message message = Mockito.mock(Message.class);
       Mockito.when(message.getChatId()).thenReturn(Long.valueOf(telegramUser.getChatId()));
       Mockito.when(message.getText()).thenReturn(LIST_GROUP_SUB.getCommandName());
       update.setMessage(message);

       String collectedGroups = "Я нашел все подписки на группы: \n\n" +
               telegramUser.getGroupSubs().stream()
                       .map(it -> "Группа: " + it.getTitle() + " , ID = " + it.getId() + " \n")
                       .collect(Collectors.joining());

       //when
       command.execute(update);

       //then
       Mockito.verify(sendBotMessageService).sendMessage(telegramUser.getChatId(), collectedGroups);
   }

   private GroupSub populateGroupSub(Integer id, String title) {
       GroupSub gs = new GroupSub();
       gs.setId(id);
       gs.setTitle(title);
       return gs;
   }
}

Geliň / kömek buýrugyny täzeläliň

Biziň ýagdaýymyzda, / help buýrugy bot bilen işlemek üçin resminama hökmünde çykyş edýär, şonuň üçin ulanyjy ulanyp biler ýaly täzelemegi ýatdan çykarmaly däldiris. Iki buýruk goşduk, geliň geljek teksti täzeläliň:
public static final String HELP_MESSAGE = String.format("✨Дотупные команды✨\n\n"

               + "Начать\\закончить работу с ботом:\n"
               + "%s - начать работу со мной\n"
               + "%s - приостановить работу со мной\n\n"

               + "Работа с подписками на группы:\n"
               + "%s - подписаться на группу статей\n"
               + "%s - получить список групп, на которые подписан\n\n"

               + "%s - получить помощь в работе со мной\n"
               + "%s - получить мою статистику использования\n",
       START.getCommandName(), STOP.getCommandName(), ADD_GROUP_SUB.getCommandName(),
       LIST_GROUP_SUB.getCommandName(), HELP.getCommandName(), STAT.getCommandName());
Botyň jogaplarynyň tekstini hem täzeledim: Ulanyjynyň elmydama adynda bolmagy üçin ýasadym, ýogsam "sen" we "sen" bolar ... Indi iň bolmanda döredip bolar botyň işinde haýsydyr bir baglanyşyk.

Täzelenen boty barlamak

Boterli ýerimizi işe girizýäris we aşakdakylary edýäris:
  1. Synagdaky ulanyjynyň maglumat bazasyna goşulandygyna göz ýetirmek üçin / start buýrugyny ýerine ýetirýäris .
  2. / Kömek buýrugyny ýerine ýetirýäris - isleýşimiz ýaly hemme zadyň gowydygyny barlaýarys.
  3. Ondan soň / addGroupSub buýrugyny ýerine ýetirýäris .
  4. Topar şahsyýetnamalarynyň teklip edilýän sanawyndan garyndasa birnäçe goşýarys.
  5. Toparlaryň ulanyja bellige alnandygyna göz ýetirmek üçin / listGroupSub buýrugyny işledýäris .
Git! Maglumatlar bazasyny docker-compose-test.yml arkaly açýarys we “SpringBoot” -a başlaýarys. Ondan soň, synag botymyza giriň we / start buýrugyny ýerine ýetiriň, ondan soň / kömek : Soňra, / addGroupSub"Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm buýrugyny giriziň : Açylýan sanawda Java müşderisiniň bolmalysy ýaly işleýändigi aýdylýar: bizde ähli toparlar bar Şahsyýetnamalar, buýrugyň beýany, indiki nämä gerekdigimize düşünmäge kömek edýär (şonuň üçin) abuna birnäçe topar goşýarys: Indi 5 sany abunalygymyz bar, şonuň üçin / listGroupSub buýrugyny işledip bileris : Soň bolsa birneme däli zat alarys ... Adyň näme üçin diňe bir kynçylyksyz görkezýändigi belli däl, ýöne bärde däl. Nämäniň bardygyny görmek üçin maglumatlar bazasyna geçeliň: Şol bir soraglar maglumatlar bazasynda ýazylýar, ýöne diňe kiril elipbiýi bolanlar üçin. Bu kodlamakda käbir problemanyň bardygyny aňladýar. Görnüşinden, maglumat bazasyna birikmek üçin maglumat bazasyny we sürüjini sazlamaly. Bize UTF-8 gerek. Emma nädip goşmaly? Internetde birnäçe minut gözlänimden soň, sürüjiniň url üýtgeýjisini täzelemelidigini gördüm . Doker-kompozisiýada doker şekilini gurmak üçin ilkinji baglanyşyk , ýöne jogap birinji däl)) Şonuň üçin muny bilip, häsiýetleri we doker-kompozisiýa faýllaryny täzeläliň. "Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm"Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm"Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm"Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-nji bölüm
application.properties:
spring.datasource.url=jdbc:mysql://jrtb-db:3306/jrtb_db?characterEncoding=UTF-8

application-test.properties:
spring.datasource.url=jdbc:mysql://localhost:3306/dev_jrtb_db?characterEncoding=UTF-8

docker-compose.yml (добавил последнюю строку):
jrtb-db:
 image: mysql:5.7
 restart: always
 environment:
   MYSQL_USER: ${BOT_DB_USERNAME}
   MYSQL_PASSWORD: ${BOT_DB_PASSWORD}
   MYSQL_DATABASE: 'jrtb_db'
   MYSQL_ROOT_PASSWORD: 'root'
 ports:
   - '3306:3306'
 expose:
   - '3306'
 command: --character-set-server=utf8 --collation-server=utf8_general_ci

docker-compose-test.yml (добавил последнюю строку)
jrtb-db-dev:
 image: mysql:5.7
 restart: always
 environment:
   MYSQL_DATABASE: 'dev_jrtb_db'
   # So you don't have to use root, but you can if you like
   MYSQL_USER: 'dev_jrtb_db_user'
   # You can use whatever password you like
   MYSQL_PASSWORD: 'dev_jrtb_db_password'
   # Password for root access
   MYSQL_ROOT_PASSWORD: 'root'
 ports:
   # <Port exposed> : < MySQL Port running inside container>
   - '3306:3306'
 expose:
   # Opens port 3306 on the container
     - '3306'
 command: --character-set-server=utf8 --collation-server=utf8_general_ci
Bu täzelenmelerden soň maglumatlar bazasyndaky ähli maglumatlary pozmaly we täzeden başlamaly. Öçürmek gaty ýönekeý: buýrugy işletmeli: docker-compose -f docker-compose-test.yml aşakda ähli maglumatlar we maglumatlar bazasy ýok edilýär. Täzelenen kodlama bilen täzeden işlediň: docker-compose -f docker-compose-test.uml up Maglumat bazasy taýýar. Täzelenen programmany işe girizeliň we göz aýlalyň. Çalt geçerin we netijäni size görkezerin: "Java-dan A-dan Z" taslamasy: Makalalar toparyna ýazylmak mümkinçiligini goşmak.  3-7-nji bölümIndi bolsa islän zadymyzy aldyk. Indi bu hakykata meňzeýär.

Soňy

Indi bu ädimi tamamlap bileris diýip pikir edýärin. Köp zat edildi, hakykatdanam köp. Programma wersiýasyny 0.5.0-SNAPSHOT we RELEASE_NOTES täzeläliň .
# Çykyş bellikleri ## 0.5.0-SNAPSHOT * JRTB-5: topara ýazylmak ukyby * JRTB-6: topar abunalarynyň sanawyny almak üçin goşmaça mümkinçilik.
Soňra hemme zat adatdakysy ýaly: ähli üýtgeşmeler bilen täze borçnama döredýäris. Esasy zat, hasabat maksady bilen bu ädimde tamamlanan iki meseläniň beýanyny goşmakdyr. Ine, teswir:
STEP_6 JRTB-5: JRTB-6 toparyna ýazylmak ukyby: topara abuna ýazylyş sanawyny görmek ukyby goşuldy.
Netijede 47 faýl üýtgedildi ... Bu uly üýtgeşiklik. Funksiýanyň beýanyndan aýdyp bilmersiňiz. Galyberse-de, doly çuňluga düşünmek üçin API üçin Java müşderisini ýazmalydygyňyzy bilmeli, esasanam ähli programmany täzeläp durmaly. Serwerde işlemek şeýle - iş köp, ýöne müşderi tarapyndan görünmek az ...)) Dostlar, adatça size işime gyzyklanma bildirmegiň usulyny hödürleýärin - github -a ýazylyň hasap , telegram kanalyna goşul we bir zat düşnüksiz bolsa makala hakda sorag ýaz! Ine, bu STEP_6 üçin üýtgeşmeler bilen çekiş haýyşyna baglanyşyk . Hemmäňize okanyňyz üçin sag boluň. Geljekde has köp - abunalygy pozmak, profili ýapmak we başgalar hakda gürleşeliň. Geçme))

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

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