ہیلو دوبارہ. یہ STEP_6 کا آخری مضمون ہے، جس میں ہم JRTB-6 ٹاسک میں فعالیت شامل کرنے کے بارے میں بات کریں گے ۔ ان دو پچھلے مضامین میں ( حصہ 1 ، حصہ 2 ) ہم نے آپ کو درکار تقریباً ہر چیز تیار کر لی ہے۔ یہ حصہ عمل کی انتہا ہے۔ ہر اس شخص کے لیے جس نے شروع سے اب تک مضامین کے اس سلسلے کو پڑھا ہے - بہت احترام۔ اس کا مطلب یہ ہے کہ آپ کے پاس ایک بہترین کام تلاش کرنے کے لیے کافی حوصلہ افزائی ہے۔ اب آتے ہیں کاروبار کی طرف۔
ہم JRTB-6 نافذ کرتے ہیں۔
اس بار ہم ٹیلیگرام بوٹ کی طرف سے کام کریں گے، کیونکہ ڈیٹا بیس کو اپ ڈیٹ کرنے کا کام مکمل ہو چکا ہے، ڈیٹا بیس کے ادارے کنفیگر ہو چکے ہیں اور کام کے لیے تیار ہیں۔ آئیے 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 استعمال کرتے ہوئے حاصل کرتے ہیں، اور گروپس کے لیے اس کی تمام رکنیتیں اس کے آبجیکٹ میں جمع کی جائیں گی۔ ہم نے اسے دوسرے حصے میں ترتیب دیا ہے۔ ایک بار پھر، میں نے //todo شامل کیا تاکہ میں آپریشن کے دوران ظاہر ہونے والے استثناء کو شامل کرنا نہ بھولوں۔ اگلا مرحلہ کمانڈ کنٹینر کو اس میں ایک نیا کمانڈ شامل کرکے اپ ڈیٹ کرنا ہے۔
put(LIST_GROUP_SUB.getCommandName(), new GroupSubListCommand(sendBotMessageService, telegramUserService))
بنیادی طور پر یہ ہے: اب آپ کو مزید ٹیسٹ لکھنے، /help کمانڈ کو اپ ڈیٹ کرنے (نئی کمانڈز کے لیے تفصیل شامل کریں) اور ٹیلیگرام کے ذریعے نئی فعالیت کی جانچ کرنے کی ضرورت ہے۔ آئیے 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());
میں نے بوٹ کے جوابات کے متن کو بھی اپ ڈیٹ کر دیا: میں نے اسے اس لیے بنایا ہے کہ یہ صارف کے ساتھ ہمیشہ پہلے نام کی شرائط پر رہے، ورنہ "آپ" اور "آپ" دونوں ہوں گے... اب کم از کم تخلیق کرنا ممکن ہو جائے گا۔ بوٹ کے کام میں کسی قسم کا تعلق۔
اپ ڈیٹ شدہ بوٹ کی جانچ کر رہا ہے۔
ہم اپنا بوٹ مقامی طور پر لانچ کرتے ہیں اور درج ذیل کام کرتے ہیں:- ہم اس بات کا یقین کرنے کے لیے /start کمانڈ پر عمل کرتے ہیں کہ ٹیسٹ کیس میں صارف کو ڈیٹا بیس میں شامل کیا گیا ہے۔
- ہم /help کمانڈ پر عمل کرتے ہیں - ہم چیک کرتے ہیں کہ سب کچھ ٹھیک ہے، جیسا کہ ہم چاہتے تھے۔
- اگلا ہم /addGroupSub کمانڈ پر عمل کرتے ہیں۔
- گروپ IDs کی مجوزہ فہرست میں سے، ہم کئی کو مرکب میں شامل کرتے ہیں۔
- ہم اس بات کو یقینی بنانے کے لیے /listGroupSub کمانڈ چلاتے ہیں کہ گروپس صارف کے لیے رجسٹرڈ ہیں۔
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 ڈیٹا بیس تیار ہے۔ آئیے اپ ڈیٹ کردہ ایپلیکیشن لانچ کریں اور ایک نظر ڈالیں۔ میں اس پر تیزی سے جاؤں گا اور آپ کو نتیجہ دکھاؤں گا: اور اب ہمیں وہی مل گیا جو ہم چاہتے تھے۔ اب یہ سچ لگتا ہے۔
ختم ہونے والا
اب مجھے لگتا ہے کہ ہم یہ مرحلہ مکمل کر سکتے ہیں۔ بہت کچھ کیا گیا ہے، واقعی بہت کچھ۔ آئیے ایپلیکیشن ورژن کو 0.5.0-SNAPSHOT اور RELEASE_NOTES میں اپ ڈیٹ کریں۔
# ریلیز نوٹس ## 0.5.0-SNAPSHOT * JRTB-5: گروپ پر سبسکرائب کرنے کی صلاحیت شامل کی گئی * JRTB-6: گروپ سبسکرپشنز کی فہرست حاصل کرنے کی صلاحیت شامل۔
پھر سب کچھ معمول کے مطابق ہے: ہم تمام تبدیلیوں کے ساتھ ایک نیا عہد بناتے ہیں۔ اہم بات یہ ہے کہ رپورٹنگ کے مقاصد کے لیے اس مرحلے کے دوران مکمل کیے گئے دو کاموں کی تفصیل شامل کریں۔ تو یہاں تبصرہ ہے:
STEP_6 JRTB-5: گروپ JRTB-6 پر سبسکرائب کرنے کی اضافی صلاحیت: گروپ سبسکرپشن کی فہرست دیکھنے کی صلاحیت شامل کی گئی۔
اس کے نتیجے میں 47 فائلیں تبدیل ہوئیں... یہ ایک بڑی تبدیلی ہے۔ اگرچہ آپ فعالیت کی تفصیل سے نہیں بتا سکتے۔ آخرکار، پوری گہرائی کو سمجھنے کے لیے، آپ کو یہ جاننا ہوگا کہ آپ کو API کے لیے جاوا کلائنٹ لکھنے کی ضرورت ہے، بنیادی طور پر پوری ایپلیکیشن کو اپ ڈیٹ کرنا۔ یہ اس طرح ہے، سرور پر کام کرنا - بہت کام ہے، لیکن کلائنٹ کی طرف سے مرئیت بہت کم ہے...)) دوستو ، میں روایتی طور پر آپ کو اپنے کام میں دلچسپی ظاہر کرنے کا ایک طریقہ پیش کرتا ہوں - ایک گیتھب کو سبسکرائب کریں اکاؤنٹ ، ٹیلیگرام چینل جوائن کریں اور مضمون کے بارے میں سوال لکھیں، اگر کچھ واضح نہیں ہے! اس STEP_6 کے لیے تبدیلیوں کے ساتھ پل کی درخواست کا لنک یہ ہے ۔ پڑھنے کے لیے سب کا شکریہ۔ مزید آنے والے ہیں - آئیے سبسکرپشن کو حذف کرنے، پروفائل کو غیر فعال کرنے، اور مزید کے بارے میں بات کرتے ہیں۔ سوئچ نہ کریں))
GO TO FULL VERSION