JavaRush /جاوا بلاگ /Random-UR /ہم مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کر ر...

ہم مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کر رہے ہیں۔ (حصہ 3) - "A سے Z تک جاوا پروجیکٹ"

گروپ میں شائع ہوا۔
ہیلو دوبارہ. یہ STEP_6 کا آخری مضمون ہے، جس میں ہم JRTB-6 ٹاسک میں فعالیت شامل کرنے کے بارے میں بات کریں گے ۔ ان دو پچھلے مضامین میں ( حصہ 1 ، حصہ 2 ) ہم نے آپ کو درکار تقریباً ہر چیز تیار کر لی ہے۔ یہ حصہ عمل کی انتہا ہے۔ ہر اس شخص کے لیے جس نے شروع سے اب تک مضامین کے اس سلسلے کو پڑھا ہے - بہت احترام۔ اس کا مطلب یہ ہے کہ آپ کے پاس ایک بہترین کام تلاش کرنے کے لیے کافی حوصلہ افزائی ہے۔ اب آتے ہیں کاروبار کی طرف۔"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 1

ہم 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());
میں نے بوٹ کے جوابات کے متن کو بھی اپ ڈیٹ کر دیا: میں نے اسے اس لیے بنایا ہے کہ یہ صارف کے ساتھ ہمیشہ پہلے نام کی شرائط پر رہے، ورنہ "آپ" اور "آپ" دونوں ہوں گے... اب کم از کم تخلیق کرنا ممکن ہو جائے گا۔ بوٹ کے کام میں کسی قسم کا تعلق۔

اپ ڈیٹ شدہ بوٹ کی جانچ کر رہا ہے۔

ہم اپنا بوٹ مقامی طور پر لانچ کرتے ہیں اور درج ذیل کام کرتے ہیں:
  1. ہم اس بات کا یقین کرنے کے لیے /start کمانڈ پر عمل کرتے ہیں کہ ٹیسٹ کیس میں صارف کو ڈیٹا بیس میں شامل کیا گیا ہے۔
  2. ہم /help کمانڈ پر عمل کرتے ہیں - ہم چیک کرتے ہیں کہ سب کچھ ٹھیک ہے، جیسا کہ ہم چاہتے تھے۔
  3. اگلا ہم /addGroupSub کمانڈ پر عمل کرتے ہیں۔
  4. گروپ IDs کی مجوزہ فہرست میں سے، ہم کئی کو مرکب میں شامل کرتے ہیں۔
  5. ہم اس بات کو یقینی بنانے کے لیے /listGroupSub کمانڈ چلاتے ہیں کہ گروپس صارف کے لیے رجسٹرڈ ہیں۔
جاؤ! ہم ڈیٹا بیس کو docker-compose-test.yml کے ذریعے لانچ کرتے ہیں اور اپنا SpringBoot شروع کرتے ہیں۔ اس کے بعد، ہمارے ٹیسٹ بوٹ پر جائیں اور /start کمانڈ پر عمل کریں، اس کے بعد /help : "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 2اگلا، کمانڈ درج کریں /addGroupSub : "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 3ڈراپ ڈاؤن فہرست کہتی ہے کہ جاوا کلائنٹ کام کر رہا ہے جیسا کہ اسے کرنا چاہیے: ہمارے پاس تمام گروپس ہیں IDs، کمانڈ کی وضاحت (امید ہے کہ) یہ سمجھنے میں مدد کرتی ہے کہ ہمیں آگے کیا ضرورت ہے، اس لیے ہم سبسکرپشن میں کئی گروپس شامل کرتے ہیں: "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 4اب ہمارے پاس 5 سبسکرپشنز ہیں، لہذا ہم /listGroupSub کمانڈ چلا سکتے ہیں : اور پھر ہمیں کچھ پاگل چیز مل جاتی ہے۔ ... یہ واضح نہیں ہے کہ عنوان"A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 5 بغیر کسی پریشانی کے کیوں دکھا رہا تھا ، لیکن یہاں نہیں۔ آئیے ڈیٹابیس پر جائیں تاکہ دیکھیں کہ وہاں کیا ہے: ڈیٹا بیس میں وہی سوالات درج ہیں، لیکن صرف ان کے لیے جو سیریلک حروف تہجی والے ہیں۔ اس کا مطلب ہے کہ انکوڈنگ میں کچھ مسئلہ ہے۔ بظاہر، آپ کو ڈیٹا بیس سے منسلک ہونے کے لیے ڈیٹا بیس اور ڈرائیور کو ترتیب دینے کی ضرورت ہے۔ ہمیں UTF-8 کی ضرورت ہے۔ لیکن اسے کیسے شامل کیا جائے؟ انٹرنیٹ پر کئی منٹ تلاش کرنے کے بعد، میں نے پایا : ڈرائیور کو یو آر ایل متغیر کو اپ ڈیٹ کرنے کی ضرورت ہے۔ اور docker-compose میں ڈوکر امیج ترتیب دینے کے لیے، پہلا لنک ، لیکن جواب پہلا نہیں ہے)) لہذا، یہ جانتے ہوئے، آئیے پراپرٹیز اور docker-compose فائلوں کو اپ ڈیٹ کرتے ہیں۔ "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 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
ان اپ ڈیٹس کے بعد، آپ کو ڈیٹا بیس میں موجود تمام ڈیٹا کو مٹانے اور دوبارہ شروع کرنے کی ضرورت ہے۔ مٹانا بہت آسان ہے: آپ کو کمانڈ چلانے کی ضرورت ہے: docker-compose -f docker-compose-test.yml نیچے جس کے بعد تمام ڈیٹا اور ڈیٹا بیس کو حذف کر دیا جاتا ہے۔ اور اپ ڈیٹ شدہ انکوڈنگ کے ساتھ اسے دوبارہ چلائیں: docker-compose -f docker-compose-test.uml up ڈیٹا بیس تیار ہے۔ آئیے اپ ڈیٹ کردہ ایپلیکیشن لانچ کریں اور ایک نظر ڈالیں۔ میں اس پر تیزی سے جاؤں گا اور آپ کو نتیجہ دکھاؤں گا: "A سے Z تک جاوا پروجیکٹ": مضامین کے گروپ کو سبسکرائب کرنے کی صلاحیت کو شامل کرنا۔  حصہ 3 - 7اور اب ہمیں وہی مل گیا جو ہم چاہتے تھے۔ اب یہ سچ لگتا ہے۔

ختم ہونے والا

اب مجھے لگتا ہے کہ ہم یہ مرحلہ مکمل کر سکتے ہیں۔ بہت کچھ کیا گیا ہے، واقعی بہت کچھ۔ آئیے ایپلیکیشن ورژن کو 0.5.0-SNAPSHOT اور RELEASE_NOTES میں اپ ڈیٹ کریں۔
# ریلیز نوٹس ## 0.5.0-SNAPSHOT * JRTB-5: گروپ پر سبسکرائب کرنے کی صلاحیت شامل کی گئی * JRTB-6: گروپ سبسکرپشنز کی فہرست حاصل کرنے کی صلاحیت شامل۔
پھر سب کچھ معمول کے مطابق ہے: ہم تمام تبدیلیوں کے ساتھ ایک نیا عہد بناتے ہیں۔ اہم بات یہ ہے کہ رپورٹنگ کے مقاصد کے لیے اس مرحلے کے دوران مکمل کیے گئے دو کاموں کی تفصیل شامل کریں۔ تو یہاں تبصرہ ہے:
STEP_6 JRTB-5: گروپ JRTB-6 پر سبسکرائب کرنے کی اضافی صلاحیت: گروپ سبسکرپشن کی فہرست دیکھنے کی صلاحیت شامل کی گئی۔
اس کے نتیجے میں 47 فائلیں تبدیل ہوئیں... یہ ایک بڑی تبدیلی ہے۔ اگرچہ آپ فعالیت کی تفصیل سے نہیں بتا سکتے۔ آخرکار، پوری گہرائی کو سمجھنے کے لیے، آپ کو یہ جاننا ہوگا کہ آپ کو API کے لیے جاوا کلائنٹ لکھنے کی ضرورت ہے، بنیادی طور پر پوری ایپلیکیشن کو اپ ڈیٹ کرنا۔ یہ اس طرح ہے، سرور پر کام کرنا - بہت کام ہے، لیکن کلائنٹ کی طرف سے مرئیت بہت کم ہے...)) دوستو ، میں روایتی طور پر آپ کو اپنے کام میں دلچسپی ظاہر کرنے کا ایک طریقہ پیش کرتا ہوں - ایک گیتھب کو سبسکرائب کریں اکاؤنٹ ، ٹیلیگرام چینل جوائن کریں اور مضمون کے بارے میں سوال لکھیں، اگر کچھ واضح نہیں ہے! اس STEP_6 کے لیے تبدیلیوں کے ساتھ پل کی درخواست کا لنک یہ ہے ۔ پڑھنے کے لیے سب کا شکریہ۔ مزید آنے والے ہیں - آئیے سبسکرپشن کو حذف کرنے، پروفائل کو غیر فعال کرنے، اور مزید کے بارے میں بات کرتے ہیں۔ سوئچ نہ کریں))

سیریز کے تمام مواد کی فہرست اس مضمون کے شروع میں ہے۔

تبصرے
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION