JavaRush /جاوا بلاگ /Random-SD /اسان مضمونن جي هڪ گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪر...

اسان مضمونن جي هڪ گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪري رهيا آهيون. (حصو 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 انهي ڪري ته مان استثناء جي سنڀال شامل ڪرڻ نه وساريندس جيڪي آپريشن دوران ظاهر ٿي سگهن ٿيون. ايندڙ قدم کي تازه ڪاري ڪرڻ آهي CommandContainer ان کي نئين حڪم شامل ڪندي:
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 ذريعي لانچ ڪيو ۽ اسان جو اسپرنگ بوٽ شروع ڪيو. اڳيون، اسان جي ٽيسٽ بوٽ ڏانھن وڃو ۽ /start ڪمانڊ تي عمل ڪريو، بعد ۾ /help : "جاوا پروجيڪٽ A کان Z تائين": مضمونن جي گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪرڻ.  حصو 3 - 2اڳيون، ڪمان داخل ڪريو /addGroupSub : "جاوا پروجيڪٽ A کان Z تائين": مضمونن جي گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪرڻ.  حصو 3 - 3ڊراپ-ڊائون لسٽ چوي ٿو ته جاوا ڪلائنٽ ڪم ڪري رھيو آھي جيئن اھو ھجڻ گھرجي: اسان وٽ سڀئي گروپ آھن انھن سان. IDs، حڪم جي وضاحت مدد ڪري ٿي (اميد سان) اهو سمجهڻ ۾ ته اسان کي اڳتي ڇا جي ضرورت آهي، تنهنڪري اسان رڪنيت ۾ ڪيترن ئي گروپن کي شامل ڪيو: "جاوا پروجيڪٽ A کان Z تائين": مضمونن جي گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪرڻ.  حصو 3 - 4هاڻي اسان وٽ 5 رڪنيتون آهن، تنهنڪري اسان ڪمانڊ هلائي سگهون ٿا /listGroupSub : "جاوا پروجيڪٽ A کان Z تائين": مضمونن جي گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪرڻ.  حصو 3 - 5۽ پوء اسان کي ڪجهه چريو حاصل ڪيو. اهو واضح ناهي ته عنوان صرف بغير ڪنهن مسئلي جي ڏيکاري رهيو هو، پر هتي نه. اچو ته ڊيٽابيس ڏانھن وڃو ڏسو ته اتي ڇا آھي: "جاوا پروجيڪٽ A کان Z تائين": مضمونن جي گروپ ۾ رڪنيت حاصل ڪرڻ جي صلاحيت شامل ڪرڻ.  حصو 3 - 6ساڳيا سوال ڊيٽابيس ۾ رڪارڊ ڪيا ويا آھن، پر صرف انھن لاءِ جن سان سيريلڪ الفابيٽ آھي. ان جو مطلب آهي ته انڪوڊنگ ۾ ڪجهه مسئلو آهي. ظاهر آهي، توهان کي ڊيٽابيس سان ڳنڍڻ لاء ڊيٽابيس ۽ ڊرائيور کي ترتيب ڏيڻ جي ضرورت آهي. اسان کي UTF-8 جي ضرورت آهي. پر ان کي ڪيئن شامل ڪرڻ لاء؟ انٽرنيٽ تي ڳولڻ جي ڪيترن ئي منٽن کان پوء، مون کي مليو : ڊرائيور کي url variable کي اپڊيٽ ڪرڻ جي ضرورت آهي. ۽ docker-compose ۾ هڪ ڊاکر تصوير قائم ڪرڻ لاء، بلڪل پهرين لنڪ ، پر جواب پهريون نه آهي)) تنهن ڪري، اهو ڄاڻڻ، اچو ته پراپرٽيز ۽ docker-compose فائلن کي تازه ڪاري ڪريون.
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 لاء جاوا ڪلائنٽ لکڻ جي ضرورت آهي، لازمي طور تي پوري ايپليڪيشن کي اپڊيٽ ڪرڻ. اهو ڪيئن آهي، هڪ سرور تي ڪم ڪري رهيو آهي - اتي تمام گهڻو ڪم آهي، پر ڪلائنٽ جي طرف کان نمائش ننڍي آهي...)) دوستو، مان روايتي طور تي توهان کي پنهنجي ڪم ۾ دلچسپي ڏيکارڻ جو هڪ طريقو پيش ڪريان ٿو - رڪنيت حاصل ڪريو هڪ github اڪائونٽ ، ٽيليگرام چينل ۾ شامل ٿيو ۽ مضمون بابت هڪ سوال لکو، جيڪڏهن ڪجهه واضح ناهي! ھتي ھڪڙي لنڪ آھي ڇڪڻ جي درخواست جي تبديلين سان گڏ ھن STEP_6 لاءِ . پڙهڻ لاءِ سڀني جي مهرباني. وڌيڪ اچڻو آهي - اچو ته هڪ رڪنيت کي ختم ڪرڻ، پروفائل کي غير فعال ڪرڻ، ۽ وڌيڪ بابت ڳالهايون. تبديل نه ڪريو))

سيريز ۾ سڀني مواد جي هڪ فهرست هن مضمون جي شروعات ۾ آهي.

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