JavaRush /Блоги Java /Random-TG /Мо қобилияти обуна шудан ба як гурӯҳи мақолаҳоро илова ме...
Roman Beekeeper
Сатҳи

Мо қобилияти обуна шудан ба як гурӯҳи мақолаҳоро илова мекунем. (Қисми 3) - "Лоиҳаи Java аз А то Я"

Дар гурӯҳ нашр шудааст
Боз салом. Ин мақолаи ниҳоии STEP_6 мебошад, ки дар он мо дар бораи илова кардани функсия ба вазифаи JRTB-6 сӯҳбат хоҳем кард . Дар он ду мақолаи қаблӣ ( қисми 1 , қисми 2 ) мо аллакай қариб ҳама чизеро, ки ба шумо лозим аст, омода кардаем. Ин қисмат кулминатсияи раванд аст. Ба хар касе, ки ин силсилаи маколахоро то ин дам аз аввал мутолиа кардааст, — эхтироми бузург. Ин маънои онро дорад, ки шумо барои пайдо кардани кори олӣ ҳавасмандии кофӣ доред. Акнун биёед ба кор равем."Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Қисми 3 - 1

Мо JRTB-6-ро татбиқ мекунем

Ин дафъа мо супоришро аз ҷониби боти телеграмма иҷро хоҳем кард, зеро кор оид ба навсозии базаи маълумот ҳама анҷом дода шудааст, an objectҳои базаи маълумотҳо танзим карда шудаанд ва ба кор омодаанд. Биёед ба CommandName арзиши нав илова кунем - LIST_GROUP_SUB:
LIST_GROUP_SUB("/listGroupSub");
Биёед фармони ListGroupSubCommand эҷод кунем :
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);
   }
}
Дар ин ҷо ҳама чиз то ҳадди имкон содда аст - мо корбарро бо истифода аз chat_id мавҷуда мегирем ва ҳамаи обунаҳои ӯ ба гурӯҳҳо дар an objectи ӯ ҷамъ карда мешаванд. Мо инро дар қисми дуюм муқаррар кардем. Боз, ман //todo -ро илова кардам, то фаромӯш накунам, ки коркарди истисноҳоеро, ки ҳангоми кор ба вуҷуд меоянд, фаромӯш накунам. Қадами навбатӣ ин навсозии CommandContainer бо илова кардани фармони нав ба он мебошад:
put(LIST_GROUP_SUB.getCommandName(), new GroupSubListCommand(sendBotMessageService, telegramUserService))
Ин асосан аст: акнун шумо бояд санҷишҳои бештар нависед, фармони / help -ро нав кунед (ба иловаи тавсиф барои фармонҳои нав) ва функсияҳои навро тавассути Telegram санҷед. Биёед барои ListGroupSubCommand санҷиш нависед . Азбаски мантиқи фармон маъмул нест, мо бидуни пайвастшавӣ ба синфи AbstractCommandTest санҷиш менависем , чунон ки қаблан карда будем:
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;
   }
}

Биёед фармони / help -ро навсозӣ кунем

Дар ҳолати мо, фармони /help ҳамчун ҳуҷҷат барои кор бо бот амал мекунад, аз ин рӯ мо бояд дар хотир дорем, ки онро навсозӣ кунем, то корбар аз он истифода барад. Мо ду фармон илова кардем, пас биёед матни омадаро навсозӣ кунем:
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());
Матни посухҳои ботро ҳам нав кардам: Ман онро тавре сохтам, ки он ҳамеша бо номи корбар бошад, вагарна ҳам “шумо” ва ҳам “шумо” мебуд... Акнун ҳадди ақалл эҷод кардан мумкин аст. як навъ робита дар кори бот.

Санҷиши боти навшуда

Мо боти худро ба таври маҳаллӣ оғоз мекунем ва корҳои зеринро иҷро мекунем:
  1. Мо фармони /start -ро иҷро мекунем , то боварӣ ҳосил кунем, ки корбар дар парвандаи санҷишӣ ба пойгоҳи додаҳо илова карда шудааст.
  2. Мо фармони /help -ро иҷро мекунем - тафтиш мекунем, ки ҳама чиз хуб аст, тавре ки мо мехостем.
  3. Баъдан мо фармони /addGroupSub -ро иҷро мекунем .
  4. Аз рӯйхати пешниҳодшудаи ID-ҳои гурӯҳ, мо ба омехта якчанд нафар илова мекунем.
  5. Мо фармони /listGroupSub -ро иҷро мекунем , то боварӣ ҳосил кунем, ки гурӯҳҳо ба корбар сабти ном шудаанд.
Бирав! Мо пойгоҳи додаҳоро тавассути docker-compose-test.yml оғоз мекунем ва SpringBoot-ро оғоз мекунем. Баъд, ба боти санҷишии мо равед ва фармони /start -ро иҷро кунед ва пас аз он /help : "Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Қисми 3 - 2Баъдан, фармонро ворид кунед /addGroupSub : "Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Қисми 3 - 3Рӯйхати афтанда мегӯяд, ки муштарии Java ба таври лозима кор мекунад: мо ҳама гурӯҳҳоро бо онҳо дорем. ID-ҳо, тавсифи фармон кӯмак мекунад (умедворам) фаҳманд, ки ба мо чӣ лозим аст, бинобар ин мо якчанд гурӯҳҳоро ба обуна илова мекунем: Ҳоло мо 5 обуна дорем, то мо метавонем фармони /listGroupSub"Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Кисми 3-4 -ро иҷро кунем : Ва он гоҳ мо як чизи девонаеро ба даст меорем. ... Маълум нест, ки чаро сарлавҳа танҳо бе мушкилот нишон дода мешуд, аммо дар ин ҷо не. Биёед ба пойгоҳи додаҳо равем, то бубинем, ки дар он ҷо чӣ ҳаст: Дар базаи маълумот ҳамон саволҳо сабт мешаванд, аммо танҳо барои онҳое, ки алифбои сириллик доранд. Ин маънои онро дорад, ки дар рамзгузорӣ мушкилот вуҷуд дорад. Эҳтимол, шумо бояд базаи маълумот ва драйверро барои пайвастшавӣ ба пойгоҳи додаҳо танзим кунед. Ба мо UTF-8 лозим аст. Аммо чӣ тавр онро илова кардан мумкин аст? Пас аз чанд дақиқа ҷустуҷӯ дар Интернет, ман пайдо кардам : ронанда бояд тағирёбандаи URL-ро навсозӣ кунад. Ва барои насб кардани тасвири докер дар docker-compose, пайванди аввалин аст , аммо ҷавоб аввалин нест)) Аз ин рӯ, инро медонем, биёед хосиятҳо ва файлҳои docker-compose-ро навсозӣ кунем. "Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Кисми 3 — 5"Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Қисми 3 - 6
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
Пас аз ин навсозиҳо, шумо бояд ҳама маълумотро дар пойгоҳи додаҳо тоза кунед ва аз нав оғоз кунед. Нобудкунӣ хеле содда аст: шумо бояд фармонро иҷро кунед: docker-compose -f docker-compose-test.yml пас аз он ҳама маълумот ва пойгоҳи додаҳо нест карда мешаванд. Ва онро дубора бо рамзгузории навшуда иҷро кунед: docker-compose -f docker-compose-test.uml up Пойгоҳи додаҳо омода аст. Биёед замимаи навшударо оғоз кунем ва назар андозем. Ман онро зуд аз назар мегузаронам ва ба шумо натиҷаро нишон медиҳам: "Лоиҳаи Java аз A то Я": Илова кардани қобorяти обуна ба гурӯҳи мақолаҳо.  Қисми 3 - 7Ва ҳоло мо он чизеро, ки мехостем, ба даст овардем. Ҳоло ин ҳақиқат ба назар мерасад.

Анҷом

Ҳоло ман фикр мекунам, ки мо метавонем ин қадамро анҷом диҳем. Бисьёр корхо карда шуданд, дар хакикат бисьёр. Биёед versionи барномаро ба 0.5.0-SNAPSHOT ва RELEASE_NOTES навсозӣ кунем.
# Қайдҳои релиз ## 0.5.0-SNAPSHOT * JRTB-5: қобorяти иловагии обуна ба гурӯҳ * JRTB-6: қобorяти иловашуда барои гирифтани рӯйхати обунаҳои гурӯҳӣ.
Он гоҳ ҳама чиз маъмулӣ аст: мо бо ҳама тағирот ӯҳдадории нав эҷод мекунем. Хӯроки асосӣ илова кардани тавсифи ду вазифаест, ки дар ин қадам бо мақсади ҳисоботдиҳӣ анҷом дода шудаанд. Пас ин шарҳ:
STEP_6 JRTB-5: қобorяти иловагии обуна ба гурӯҳи JRTB-6: қобorяти иловагии дидани рӯйхати обунаи гурӯҳ.
Дар натича 47 файли тагйир ёфт... Ин дигаргунии калон аст. Гарчанде ки шумо аз тавсифи функсияҳо гуфта наметавонед. Дар ниҳоят, барои фаҳмидани умқи пурра, шумо бояд бидонед, ки ба шумо лозим аст, ки мизоҷи Java-ро барои API нависед, аслан тамоми барномаро навсозӣ кунед. Ин тавр аст, кор дар server - кор зиёд аст, аммо намуди зоҳирӣ аз ҷониби муштарӣ хурд аст...)) Дӯстон, ман маъмулан ба шумо як роҳи таваҷҷуҳ ба кори манро пешниҳод мекунам - ба github обуна шавед. ҳисоб , ба канали телеграм ҳамроҳ шавед ва дар бораи мақола савол нависед, агар чизе равшан набошад! Ин аст пайванд ба дархости кашидан бо тағирот барои ин STEP_6 . Ташаккур ба ҳама барои хондан. Боз дар оянда - биёед дар бораи нест кардани обуна, ғайрифаъол кардани профил ва ғайра сӯҳбат кунем. Гузар накунед))

Рӯйхати ҳамаи маводҳои силсила дар аввали ин мақола аст.

Шарҳҳо
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION