JavaRush /จาวาบล็อก /Random-TH /เรากำลังเพิ่มความสามารถในการสมัครรับข้อมูลกลุ่มบทความ (ตอ...
Roman Beekeeper
ระดับ

เรากำลังเพิ่มความสามารถในการสมัครรับข้อมูลกลุ่มบทความ (ตอนที่ 3) - "โครงการ Java จาก A ถึง Z"

เผยแพร่ในกลุ่ม
สวัสดีอีกครั้ง. นี่เป็นบทความสุดท้ายจาก STEP_6 ซึ่งเราจะพูดถึงการเพิ่มฟังก์ชันการทำงานให้กับ งาน JRTB-6 ในสองบทความก่อนหน้านี้ ( ตอนที่ 1 , ตอนที่ 2 ) เราได้เตรียมเกือบทุกอย่างที่คุณต้องการแล้ว ส่วนนี้เป็นสุดยอดของกระบวนการ ถึงทุกคนที่อ่านบทความชุดนี้ตั้งแต่ต้นจนจบ - ด้วยความเคารพอย่างสูง ซึ่งหมายความว่าคุณมีแรงจูงใจเพียงพอที่จะหางานดีๆ ได้ ตอนนี้เรามาทำธุรกิจกันดีกว่า"โครงการ Java จาก 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 (เพิ่มคำอธิบายสำหรับคำสั่งใหม่) และทดสอบฟังก์ชันใหม่ผ่านทาง Telegram มาเขียนการทดสอบสำหรับ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. จากรายการ ID กลุ่มที่เสนอ เราได้เพิ่มหลายรายการในการผสม
  5. เรารัน คำสั่ง /listGroupSubเพื่อให้แน่ใจว่ากลุ่มต่างๆ ได้รับการลงทะเบียนกับผู้ใช้แล้ว
ไป! เราเปิดตัวฐานข้อมูลผ่าน docker-compose-test.yml และเริ่ม SpringBoot ของเรา จากนั้น ไปที่บอททดสอบของเราและดำเนินการคำสั่ง /start ตามด้วย/help : "โครงการ Java จาก A ถึง Z": การเพิ่มความสามารถในการสมัครรับกลุ่มบทความ  ส่วนที่ 3 - 2จากนั้นป้อนคำสั่ง/addGroupSub : "โครงการ Java จาก A ถึง Z": การเพิ่มความสามารถในการสมัครรับกลุ่มบทความ  ส่วนที่ 3 - 3รายการแบบเลื่อนลงระบุว่าไคลเอ็นต์ Java ทำงานตามที่ควรจะเป็น: เรามีกลุ่มทั้งหมดที่มี ID คำอธิบายของคำสั่งจะช่วยให้ (หวังว่า) เข้าใจสิ่งที่เราต้องการต่อไป ดังนั้นเราจึงเพิ่มหลายกลุ่มในการสมัครสมาชิก: "โครงการ Java จาก A ถึง Z": การเพิ่มความสามารถในการสมัครรับกลุ่มบทความ  ส่วนที่ 3 - 4ตอนนี้เรามีการสมัครสมาชิก 5 รายการ ดังนั้นเราสามารถรัน คำสั่ง /listGroupSub : แล้วเราก็เจอสิ่งที่บ้าบอบางอย่าง ... ยังไม่ชัดเจนว่า เหตุใด"โครงการ Java จาก A ถึง Z": การเพิ่มความสามารถในการสมัครรับกลุ่มบทความ  ส่วนที่ 3 - 5จึงแสดง ชื่อได้ โดยไม่มีปัญหาใดๆ แต่ไม่ใช่ที่นี่ ไปที่ฐานข้อมูลเพื่อดูว่ามีอะไรอยู่บ้าง: คำถามเดียวกันนี้จะถูกบันทึกไว้ในฐานข้อมูล แต่สำหรับผู้ที่มีอักษรซีริลลิกเท่านั้น ซึ่งหมายความว่ามีปัญหาในการเข้ารหัส เห็นได้ชัดว่าคุณต้องกำหนดค่าฐานข้อมูลและไดรเวอร์สำหรับการเชื่อมต่อกับฐานข้อมูล เราต้องการ UTF-8 แต่จะเพิ่มได้อย่างไร? หลังจากค้นหาบนอินเทอร์เน็ตหลายนาทีฉันพบว่า : ไดรเวอร์จำเป็นต้องอัปเดตตัวแปร url และสำหรับการตั้งค่าอิมเมจนักเทียบท่าใน docker-compose ลิงก์แรกสุดแต่คำตอบไม่ใช่ลิงก์แรก)) ดังนั้นเมื่อรู้สิ่งนี้แล้ว มาอัปเดตคุณสมบัติและไฟล์นักเทียบท่าเขียนกันดีกว่า "โครงการ Java จาก 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 down หลังจากนั้นข้อมูลและฐานข้อมูลทั้งหมดจะถูกลบ และรันอีกครั้งด้วยการเข้ารหัสที่อัปเดต: docker-compose -f docker-compose-test.uml up ฐานข้อมูลพร้อมแล้ว มาเปิดแอปพลิเคชั่นที่อัปเดตแล้วลองดู ฉันจะอธิบายอย่างรวดเร็วและแสดงผลลัพธ์ให้คุณเห็น"โครงการ Java จาก A ถึง Z": การเพิ่มความสามารถในการสมัครรับกลุ่มบทความ  ส่วนที่ 3 - 7และตอนนี้เราก็ได้สิ่งที่เราต้องการแล้ว ตอนนี้ดูเหมือนความจริง

ตอนจบ

ตอนนี้ฉันคิดว่าเราสามารถทำขั้นตอนนี้ให้เสร็จสิ้นได้ ทำไปเยอะแล้ว เยอะมากจริงๆ มาอัปเดตเวอร์ชันแอปพลิเคชันเป็น0.5.0-SNAPSHOTและ RELEASE_NOTES
# Release Notes ## 0.5.0-SNAPSHOT * JRTB-5: เพิ่มความสามารถในการสมัครสมาชิกในกลุ่ม * JRTB-6: เพิ่มความสามารถในการรับรายการการสมัครสมาชิกกลุ่ม
จากนั้นทุกอย่างก็เป็นไปตามปกติ: เราสร้างการคอมมิตใหม่พร้อมกับการเปลี่ยนแปลงทั้งหมด สิ่งสำคัญคือการเพิ่มคำอธิบายของงานทั้งสองที่เสร็จสมบูรณ์ในระหว่างขั้นตอนนี้เพื่อวัตถุประสงค์ในการรายงาน นี่คือความคิดเห็น:
STEP_6 JRTB-5: เพิ่มความสามารถในการสมัครสมาชิกกลุ่ม JRTB-6: เพิ่มความสามารถในการดูรายการการสมัครสมาชิกกลุ่ม
ส่งผลให้มีไฟล์ที่เปลี่ยนแปลง 47 ไฟล์... นั่นเป็นการเปลี่ยนแปลงครั้งใหญ่ แม้ว่าคุณจะไม่สามารถบอกได้จากคำอธิบายฟังก์ชันการทำงานก็ตาม ท้ายที่สุด เพื่อทำความเข้าใจเชิงลึกทั้งหมด คุณจำเป็นต้องรู้ว่าคุณต้องเขียนไคลเอนต์ Java สำหรับ API โดยพื้นฐานแล้วจะต้องอัปเดตแอปพลิเคชันทั้งหมด นี่คือวิธีที่เป็นอยู่ ทำงานบนเซิร์ฟเวอร์ - มีงานเยอะ แต่การมองเห็นจากฝั่งไคลเอ็นต์มีน้อย...)) เพื่อน ๆ ฉันเสนอวิธีแสดงความสนใจในงานของฉันมาให้คุณแล้ว - สมัครสมาชิกGitHub บัญชีเข้าร่วมช่องโทรเลขและเขียนคำถามเกี่ยวกับบทความหากมีอะไรไม่ชัดเจน! นี่คือลิงก์ไปยังคำขอดึงที่มีการเปลี่ยนแปลงสำหรับSTEP_6นี้ ขอบคุณทุกคนที่อ่าน ฟีเจอร์อื่นๆ ที่จะตามมา - มาพูดถึงการลบการสมัครรับข้อมูล การปิดใช้งานโปรไฟล์ และอื่นๆ กันดีกว่า อย่าเปลี่ยน))

รายการเนื้อหาทั้งหมดในซีรีส์นี้อยู่ที่ตอนต้นของบทความนี้

ความคิดเห็น
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION