Ý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ň.
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:- Synagdaky ulanyjynyň maglumat bazasyna goşulandygyna göz ýetirmek üçin / start buýrugyny ýerine ýetirýäris .
- / Kömek buýrugyny ýerine ýetirýäris - isleýşimiz ýaly hemme zadyň gowydygyny barlaýarys.
- Ondan soň / addGroupSub buýrugyny ýerine ýetirýäris .
- Topar şahsyýetnamalarynyň teklip edilýän sanawyndan garyndasa birnäçe goşýarys.
- Toparlaryň ulanyja bellige alnandygyna göz ýetirmek üçin / listGroupSub buýrugyny işledýäris .
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: Indi 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))
GO TO FULL VERSION