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.
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:- Kita nglakokake perintah / miwiti kanggo mesthekake yen pangguna ing kasus uji wis ditambahake menyang database.
- Kita nglakokake perintah /help - kita priksa manawa kabeh ok, kaya sing dikarepake.
- Sabanjure kita nglakokake perintah / addGroupSub .
- Saka dhaptar ID grup sing diusulake, kita nambah sawetara menyang campuran.
- Kita mbukak printah /listGroupSub kanggo mesthekake yen grup wis kedhaftar kanggo pangguna.
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: Lan 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))
GO TO FULL VERSION