JavaRush /Java Blog /Random-TL /Nagdaragdag kami ng kakayahang mag-subscribe sa isang pan...

Nagdaragdag kami ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo. (Bahagi 3) - "Proyekto ng Java mula A hanggang Z"

Nai-publish sa grupo
Hi ulit. Ito ang huling artikulo mula sa STEP_6, kung saan pag-uusapan natin ang pagdaragdag ng functionality sa JRTB-6 na gawain . Sa dalawang nakaraang artikulong iyon ( bahagi 1 , bahagi 2 ) ay naihanda na namin ang halos lahat ng kailangan mo. Ang bahaging ito ay ang kasukdulan ng proseso. Sa lahat ng nakabasa nitong serye ng mga artikulo hanggang sa puntong ito mula pa sa simula - malaking paggalang. Nangangahulugan ito na mayroon kang sapat na pagganyak upang makahanap ng isang mahusay na trabaho. Ngayon ay bumaba tayo sa negosyo."Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 1

Ipinapatupad namin ang JRTB-6

Sa oras na ito gagawin namin ang gawain mula sa gilid ng bot ng telegrama, dahil ang gawain sa pag-update ng database ay tapos na, ang mga entity ng database ay na-configure at handa na para sa trabaho. Magdagdag tayo ng bagong value sa CommandName - LIST_GROUP_SUB:
LIST_GROUP_SUB("/listGroupSub");
Gumawa tayo ng isang ListGroupSubCommand na utos :
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);
   }
}
Narito ang lahat ay kasing simple hangga't maaari - nakuha namin ang gumagamit gamit ang umiiral na chat_id, at lahat ng kanyang mga subscription sa mga grupo ay kokolektahin sa kanyang bagay. Itinakda namin ito sa ikalawang bahagi. Muli, idinagdag ko ang //todo upang hindi ko makalimutang magdagdag ng paghawak sa mga pagbubukod na maaaring lumabas sa panahon ng operasyon. Ang susunod na hakbang ay i-update ang CommandContainer sa pamamagitan ng pagdaragdag ng bagong command dito:
put(LIST_GROUP_SUB.getCommandName(), new GroupSubListCommand(sendBotMessageService, telegramUserService))
Iyon talaga: ngayon kailangan mong magsulat ng higit pang mga pagsubok, i-update ang /help command (magdagdag ng paglalarawan para sa mga bagong command) at subukan ang bagong functionality sa pamamagitan ng Telegram. Sumulat tayo ng pagsubok para sa ListGroupSubCommand . Dahil ang lohika ng utos ay hindi pangkaraniwan, magsusulat kami ng isang pagsubok nang hindi nakatali sa klase ng AbstractCommandTest , tulad ng ginawa namin noon:
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;
   }
}

I-update natin ang /help command

Sa aming kaso, ang /help command ay gumaganap bilang dokumentasyon para sa pagtatrabaho sa bot, kaya dapat nating tandaan na i-update ito upang magamit ito ng user. Nagdagdag kami ng dalawang command, kaya i-update natin ang text na darating:
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());
In-update ko rin ang teksto ng mga tugon ng bot: Ginawa ko ito upang ito ay palaging nasa mga termino ng pangalan sa gumagamit, kung hindi, magkakaroon ng parehong "ikaw" at "ikaw"... Ngayon ay posible nang lumikha ng hindi bababa sa ilang uri ng koneksyon sa gawain ng bot.

Sinusubukan ang na-update na bot

Inilunsad namin ang aming bot nang lokal at ginagawa ang sumusunod:
  1. Isinasagawa namin ang /start na utos upang matiyak na ang user sa test case ay naidagdag sa database.
  2. Isinasagawa namin ang utos na /help - tinitingnan namin kung ok ang lahat, ayon sa gusto namin.
  3. Susunod, isasagawa namin ang utos na /addGroupSub .
  4. Mula sa iminungkahing listahan ng mga ID ng grupo, nagdaragdag kami ng ilan sa halo.
  5. Pinapatakbo namin ang command na /listGroupSub upang matiyak na ang mga grupo ay nakarehistro sa user.
Go! Inilunsad namin ang database sa pamamagitan ng docker-compose-test.yml at simulan ang aming SpringBoot. Susunod, pumunta sa aming test bot at i-execute ang /start command, na sinusundan ng /help : "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 2Susunod, ipasok ang command /addGroupSub : "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 3Sinasabi ng drop-down list na gumagana ang Java client ayon sa nararapat: mayroon kaming lahat ng mga grupo sa kanilang Mga ID, isang paglalarawan ng command ay nakakatulong (sana) na maunawaan kung ano ang susunod na kailangan namin, kaya nagdagdag kami ng ilang grupo sa subscription: "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 4Ngayon ay mayroon na kaming 5 mga subscription, para mapatakbo namin ang /listGroupSub na utos : At pagkatapos ay nakakakuha kami ng ilang uri ng kabaliwan. ... Hindi malinaw kung bakit "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 5ipinapakita lang ang pamagat nang walang anumang problema, ngunit hindi dito. Pumunta tayo sa database upang makita kung ano ang naroroon: "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 6Ang parehong mga tanong ay naitala sa database, ngunit para lamang sa mga may Cyrillic alphabet. Nangangahulugan ito na may ilang problema sa pag-encode. Tila, kailangan mong i-configure ang database at ang driver para sa pagkonekta sa database. Kailangan namin ng UTF-8. Ngunit paano ito idagdag? Pagkatapos ng ilang minuto ng paghahanap sa Internet, nakita ko : kailangang i-update ng driver ang url variable. At para sa pag-set up ng isang docker na imahe sa docker-compose, ang pinakaunang link , ngunit ang sagot ay hindi ang una)) Samakatuwid, alam ito, i-update natin ang mga katangian at docker-compose na mga file.
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
Pagkatapos ng mga update na ito, kailangan mong burahin ang lahat ng data sa database at magsimulang muli. Napakasimple ng pagbubura: kailangan mong patakbuhin ang command: docker-compose -f docker-compose-test.yml pababa pagkatapos kung saan ang lahat ng data at database ay tatanggalin. At patakbuhin itong muli, kasama ang na-update na encoding: docker-compose -f docker-compose-test.uml up Handa na ang database. Ilunsad natin ang na-update na application at tingnan natin. Dadalhin ko ito nang mabilis at ipapakita sa iyo ang resulta: "Proyekto ng Java mula A hanggang Z": Pagdaragdag ng kakayahang mag-subscribe sa isang pangkat ng mga artikulo.  Bahagi 3 - 7At ngayon nakuha namin ang eksaktong gusto namin. Ngayon ito ay mukhang katotohanan.

Pagtatapos

Ngayon sa tingin ko maaari nating kumpletuhin ang hakbang na ito. Maraming nagawa, marami talaga. I-update natin ang bersyon ng application sa 0.5.0-SNAPSHOT at RELEASE_NOTES.
# Mga Tala sa Paglabas ## 0.5.0-SNAPSHOT * JRTB-5: idinagdag na kakayahang mag-subscribe sa grupo * JRTB-6: idinagdag ang kakayahang makakuha ng listahan ng mga subscription ng grupo.
Pagkatapos ang lahat ay gaya ng dati: gumagawa kami ng bagong commit sa lahat ng pagbabago. Ang pangunahing bagay ay magdagdag ng paglalarawan ng dalawang gawain na natapos sa hakbang na ito para sa mga layunin ng pag-uulat. Kaya narito ang komento:
STEP_6 JRTB-5: nagdagdag ng kakayahang mag-subscribe sa pangkat na JRTB-6: nagdagdag ng kakayahang makita ang listahan ng subscription ng grupo.
Nagresulta ito sa 47 binagong file... Malaking pagbabago iyon. Bagama't hindi mo masasabi mula sa paglalarawan ng pag-andar. Pagkatapos ng lahat, upang maunawaan ang buong lalim, kailangan mong malaman na kailangan mong magsulat ng isang Java client para sa API, mahalagang ina-update ang buong application. Ito ay kung paano ito, nagtatrabaho sa server - mayroong maraming trabaho, ngunit ang kakayahang makita mula sa panig ng kliyente ay maliit...)) Mga kaibigan , tradisyonal akong nag-aalok sa iyo ng isang paraan upang magpakita ng interes sa aking trabaho - mag-subscribe sa isang github account , sumali sa telegram channel at magsulat ng tanong tungkol sa artikulo, kung may hindi malinaw! Narito ang isang link sa pull request na may mga pagbabago para sa STEP_6 na ito . Salamat sa lahat ng nagbabasa. Marami pang darating - pag-usapan natin ang tungkol sa pagtanggal ng subscription, pag-deactivate ng profile, at higit pa. Huwag lumipat))

Ang isang listahan ng lahat ng mga materyales sa serye ay nasa simula ng artikulong ito.

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