JavaRush /Blog Jawa /Random-JV /Kita nambahake kemampuan kanggo langganan klompok artikel...

Kita nambahake kemampuan kanggo langganan klompok artikel. (Part 3) - "Proyek Jawa saka A nganti Z"

Diterbitake ing grup
Hai maneh. Iki minangka artikel pungkasan saka STEP_6, ing ngendi kita bakal ngomong babagan nambah fungsi menyang tugas JRTB-6 . Ing rong artikel sadurunge ( bagean 1 , bagean 2 ) kita wis nyiapake meh kabeh sing dibutuhake. Bagian iki minangka puncak saka proses kasebut. Kanggo kabeh wong sing wis maca seri artikel iki nganti titik iki wiwit wiwitan - hormat banget. Iki tegese sampeyan duwe motivasi sing cukup kanggo golek proyek sing apik. Saiki ayo pindhah menyang bisnis."Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 1

Kita ngleksanakake JRTB-6

Wektu iki kita bakal nindakake tugas saka sisih bot telegram, amarga karya nganyari database wis rampung, entitas database wis dikonfigurasi lan siap kerja. Ayo nambahake nilai anyar menyang CommandName - LIST_GROUP_SUB:
LIST_GROUP_SUB("/listGroupSub");
Ayo nggawe perintah 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);
   }
}
Ing kene kabeh gampang sabisa - kita entuk pangguna nggunakake chat_id sing ana, lan kabeh langganan grup bakal diklumpukake ing obyek kasebut. Kita nyetel iki ing bagean kapindho. Maneh, aku nambah // todo supaya aku ora lali kanggo nambah nangani pangecualian sing bisa njedhul sak operasi. Langkah sabanjure yaiku nganyari CommandContainer kanthi nambahake perintah anyar:
put(LIST_GROUP_SUB.getCommandName(), new GroupSubListCommand(sendBotMessageService, telegramUserService))
Sejatine iku: saiki sampeyan kudu nulis luwih akeh tes, nganyari perintah / help (nambah katrangan kanggo printah anyar) lan nyoba fungsi anyar liwat Telegram. Ayo nulis tes kanggo ListGroupSubCommand . Amarga logika perintah kasebut ora khas, kita bakal nulis tes tanpa diikat karo kelas AbstractCommandTest , kaya sing ditindakake sadurunge:
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;
   }
}

Ayo nganyari printah /help

Ing kasus kita, printah /help tumindak minangka dokumentasi kanggo nggarap bot, supaya kita kudu elinga nganyari supaya pangguna bisa nggunakake. Kita wis nambahake rong prentah, mula ayo nganyari teks sing bakal teka:
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());
Aku uga nganyari teks saka respon bot: Aku digawe supaya iku tansah ing jeneng pisanan istilah karo pangguna, yen ora bakal ana loro "sampeyan" lan "sampeyan"... Saiki bakal bisa kanggo nggawe paling ora. sawetara jinis sambungan ing karya bot.

Nguji bot sing dianyari

Kita miwiti bot kita sacara lokal lan nindakake ing ngisor iki:
  1. Kita nglakokake perintah / miwiti kanggo mesthekake yen pangguna ing kasus uji wis ditambahake menyang database.
  2. Kita nglakokake perintah /help - kita priksa manawa kabeh ok, kaya sing dikarepake.
  3. Sabanjure kita nglakokake perintah / addGroupSub .
  4. Saka dhaptar ID grup sing diusulake, kita nambah sawetara menyang campuran.
  5. Kita mbukak printah /listGroupSub kanggo mesthekake yen grup wis kedhaftar kanggo pangguna.
Tindak! Kita miwiti database liwat docker-compose-test.yml lan miwiti SpringBoot kita. Sabanjure, pindhah menyang test bot kita lan nglakokaké printah / miwiti, ngiring dening / help : "Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 2Sabanjure, ketik printah / addGroupSub : "Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 3Dhaptar gulung-mudhun ngandika yen klien Jawa digunakake minangka ngirim: kita duwe kabeh grup karo sing ID, katrangan saka printah kasebut mbantu (muga-muga) ngerti apa sing dibutuhake sabanjure, mula kita nambah sawetara klompok menyang langganan: "Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 4Saiki kita duwe 5 langganan, supaya kita bisa mbukak perintah /listGroupSub : Banjur kita entuk sawetara jinis edan. ... Ora jelas kenapa judhul kasebut"Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 5 mung ditampilake tanpa masalah, nanging ora ana ing kene. Ayo menyang database kanggo ndeleng apa ana: Pitakonan padha direkam ing database, nanging mung kanggo sing nganggo aksara Sirilik. Iki tegese ana sawetara masalah karo enkoding. Ketoke, sampeyan kudu ngatur database lan driver kanggo nyambung menyang database. Kita butuh UTF-8. Nanging carane nambah? Sawise sawetara menit nggoleki ing Internet, aku nemokake : driver kudu nganyari variabel url. Lan kanggo nyetel gambar docker ing docker-compose, link banget pisanan , nanging jawabane ora pisanan)) Mulane, ngerti iki, ayo nganyari properti lan file docker-nyipta. "Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 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
Sawise nganyari iki, sampeyan kudu mbusak kabeh data ing database lan miwiti maneh. Mbusak prasaja banget: sampeyan kudu mbukak printah: docker-compose -f docker-compose-test.yml mudhun sawise kabeh data lan database dibusak. Lan mbukak maneh, karo enkoding dianyari: docker-compose -f docker-compose-test.uml munggah Database wis siyap. Ayo miwiti aplikasi sing dianyari lan delengen. Aku bakal nliti kanthi cepet lan nuduhake asil: "Proyek Jawa saka A nganti Z": Nambahake kemampuan kanggo langganan klompok artikel.  Bagean 3 - 7Lan saiki kita entuk apa sing dikarepake. Saiki iki katon kaya bebener.

Ending

Saiki aku mikir kita bisa ngrampungake langkah iki. Akeh sing wis ditindakake, pancen akeh. Ayo nganyari versi aplikasi kanggo 0.5.0-SNAPSHOT lan RELEASE_NOTES.
# Cathetan Rilis ## 0.5.0-SNAPSHOT * JRTB-5: nambah kemampuan kanggo langganan grup * JRTB-6: nambah kemampuan kanggo entuk dhaptar langganan grup.
Banjur kabeh kaya biasane: kita nggawe komitmen anyar kanthi kabeh owah-owahan. Sing utama yaiku nambahake katrangan babagan rong tugas sing wis rampung sajrone langkah iki kanggo tujuan pelaporan. Dadi iki komentar:
STEP_6 JRTB-5: nambah kemampuan kanggo langganan ing grup JRTB-6: nambah kemampuan kanggo ndeleng dhaptar langganan grup.
Iki nyebabake 47 file sing diganti ... Iku owah-owahan gedhe. Senajan sampeyan ora bisa ngomong saka gambaran saka fungsi. Sawise kabeh, kanggo ngerti ambane lengkap, sampeyan kudu ngerti yen sampeyan kudu nulis klien Java kanggo API, ateges nganyari kabeh aplikasi. Iki carane, nggarap server - ana akeh karya, nanging visibilitas saka sisih klien cilik ...)) Kanca-kanca, aku tradisional menehi sampeyan cara kanggo nuduhake kapentingan ing karya - langganan github akun , gabung karo saluran telegram lan nulis pitakonan babagan artikel kasebut, yen ana sing ora jelas! Punika link menyang panjalukan narik karo owah-owahan kanggo STEP_6 iki . Matur nuwun kanggo kabeh sing wis maca. Liyane sing bakal teka - ayo ngomong babagan mbusak langganan, mateni profil, lan liya-liyane. Aja ngalih))

Dhaptar kabeh materi ing seri kasebut ana ing wiwitan artikel iki.

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