JavaRush /جاوا بلاگ /Random-SD /آرٽيڪلز ۾ ڪلائنٽ شامل ڪرڻ - "جاوا پروجيڪٽ A کان Z تائين"

آرٽيڪلز ۾ ڪلائنٽ شامل ڪرڻ - "جاوا پروجيڪٽ A کان Z تائين"

گروپ ۾ شايع ٿيل
سڀني کي سلام، منهنجا پيارا دوست. قدم بہ قدم اسان پنھنجي مقصد جي ويجھو ٿي رھيا آھيون - پنھنجي پروجيڪٽ جو MVP ٿيڻ - JavaRush Telegram Bot. جيئن مون گذريل مضمون ۾ چيو، اتي صرف 5 ڪم رهجي ويا آهن. اڄ اسان انهن مان ٻن کي ڍڪيندا سين. "جاوا پروجيڪٽ A کان Z تائين": آرٽيڪلز ۾ ڪلائنٽ شامل ڪرڻ - 1مان ورجائڻ چاهيان ٿو ته پروجيڪٽ هتي ختم نه ٿيندو. مون وٽ اڃا تائين خيالن ۽ نظرين جو هڪ ٽين آهي ته هن منصوبي کي ڪيئن ترقي ڪرڻ گهرجي، ان ۾ ڪهڙيون نيون شيون شامل ڪري سگهجن ٿيون، ڇا بهتر ٿي سگهي ٿو. MVP کان اڳ، اسان ريفڪٽرنگ جي موضوع تي هڪ الڳ مضمون ڪنداسين - اهو آهي، ڪوڊ جي معيار کي بهتر ڪرڻ جي باري ۾ ان جي ڪارڪردگي کي تبديل ڪرڻ کان سواء. ان وقت تائين، سمورو منصوبو نظر ايندو ۽ اهو واضح ٿي ويندو ته ڇا ۽ ڪٿي بهتر ٿي سگهي ٿو. اسان جي حالت ۾، اسان ڪارڪردگي کي ٽوڙڻ کان وڌ کان وڌ محفوظ ڪيو ويندو، ڇاڪاڻ ته ڪيترائي امتحان لکيا ويا آهن. اسان اهو به لکنداسين ته اسان ڇا چاهيون ٿا ۽ آخر ۾ اسان کي ڇا مليو. هي هڪ تمام مفيد شيء آهي: اچو ته ڏسو ته ڪيئن صحيح طريقي سان هر شيء ڇهه مهينا اڳ ڏٺو ويو. گهٽ ۾ گهٽ اهو مون لاء ڏاڍو دلچسپ آهي. جيڪڏهن ڪو ماڻهو پاڻ کي دستي ٽيسٽر طور آزمائي ٿو، اسان ڏانهن لکو ۽ اسان تعاون ڪنداسين. اچو ته گڏجي ھن منصوبي کي بھتر بڻايون! تنهن ڪري، هتي اهي آهن: ٻه ڪم ڇهه مهينا اڳ بيان ڪيا ويا آهن: JRTB-8 ۽ JRTB-9 . مون ڏسڻ شروع ڪيو ته انهن ڪمن لاءِ ڪهڙي ضرورت کي لاڳو ڪرڻ جي ضرورت آهي، ۽ محسوس ڪيو ته ڪمانڊ لانچ ڪرڻ جي سلسلي ۾، سڀ ڪجهه اڳ ۾ ئي تيار هو. اهو ٿئي ٿو...) هتي، توهان ڏسي سگهو ٿا StartCommand ، عمل جو طريقو :
@Override
public void execute(Update update) {
   String chatId = update.getMessage().getChatId().toString();

   telegramUserService.findByChatId(chatId).ifPresentOrElse(
           user -> {
               user.setActive(true);
               telegramUserService.save(user);
           },
           () -> {
               TelegramUser telegramUser = new TelegramUser();
               telegramUser.setActive(true);
               telegramUser.setChatId(chatId);
               telegramUserService.save(telegramUser);
           });

   sendBotMessageService.sendMessage(chatId, START_MESSAGE);
}
منطق هتي ڪم ڪري ٿو: جيڪڏهن اسان جي ڊيٽابيس ۾ اڳ ۾ ئي اهڙو صارف آهي chatId، اسان صرف ان لاءِ فعال = سچو ميدان مقرر ڪريون ٿا. ۽ جيڪڏهن ڪو اهڙو صارف نه آهي، اسان هڪ نئون ٺاهيندا آهيون. StopCommand ۾ /stop حڪم لاءِ ساڳيو :
@Override
public void execute(Update update) {
   telegramUserService.findByChatId(update.getMessage().getChatId().toString())
           .ifPresent(it -> {
               it.setActive(false);
               telegramUserService.save(it);
           });
   sendBotMessageService.sendMessage(update.getMessage().getChatId().toString(), STOP_MESSAGE);
}
اهو ڏسي سگھجي ٿو ته جڏهن هن حڪم کي سڏيندو، صرف فعال = غلط فيلڊ استعمال ڪندڙ لاء مقرر ڪيو ويو آهي. ۽ اهو سڀ ڪجهه آهي: هن جون سبسڪرپشنون رهنديون ۽ انتظار ڪندا جڏهن صارف ٻيهر بوٽ سان چيٽ کي چالو ڪرڻ جو فيصلو ڪندو. ۽ اهو لڳي ٿو ته ڪم مڪمل ٿي چڪو آهي ۽ بند ڪري سگهجي ٿو. پر اهو اتي نه هو. سڀ کان اهم ڪم سبسڪرپشن ۾ نون مضمونن بابت خبرداري پيدا ڪرڻ آهي. هي آهي جتي اهي ڪم مڪمل طور تي اپڊيٽ ۽ مڪمل ڪيا ويندا. اهو آهي، جيستائين اسان نئين آرٽيڪل جي نوٽيفڪيشن تي عمل نه ڪيو آهي، اهو بند نٿو ڪري سگهجي. تنهن ڪري، اچو ته ڪم جو خيال رکون JRTB-4 - هر 20 منٽن تي هڪ چيڪ ٺاهڻ ۽ نون آرٽيڪل بابت نوٽيفڪيشن. دوستو! ڇا توھان فوري طور ڄاڻڻ چاھيو ٿا جڏھن پروجيڪٽ لاءِ نئون ڪوڊ جاري ڪيو وڃي؟ نئون مضمون ڪڏهن نڪرندو؟ منهنجي ٽي جي چينل ۾ شامل ٿيو . اتي آئون پنهنجا آرٽيڪل، منهنجا خيال، منهنجي اوپن سورس ڊولپمينٽ گڏ ڪريان ٿو.

اسان JRTB-4 لاڳو ڪندا آهيون

هن ڪم جي حصي طور اسان کي ڇا ڪرڻ گهرجي:
  1. هڪ نوڪري ٺاهيو جيڪو وقتي طور تي سڀني گروپن جو دورو ڪندو جنهن لاءِ اسان وٽ ڊيٽابيس ۾ سبسڪرپشن آهن، آرٽيڪل کي ترتيب ڏيو اشاعت جي تاريخ جي مطابق ۽ چيڪ ڪريو ته ڇا آخري اشاعت جي ID GroupSub جي قيمت سان ملي ٿي. جيڪڏهن اهو نه ٿو ملي، ته توهان کي سمجهڻ جي ضرورت آهي ته آخري وقت کان وٺي ڪيترا آرٽيڪل شايع ڪيا ويا آهن. اسان گروپSub7 ۾ last_article_id کي موجوده حالت ۾ اپڊيٽ ڪيو.

  2. جڏهن اسان کي شايع ٿيل مضمونن جي هڪ فهرست ملي آهي، اسان انهن گروپن لاءِ سڀئي ACTIVE استعمال ڪندڙ ڳوليندا آهيون ۽ انهن کي نون مضمونن بابت اطلاع موڪليندا آهيون.

هن کي ڪرڻ لاء، اسان اهڙي شيء کي استعمال ڪنداسين بهار جي شيڊولر. هي بهار جي فريم ورڪ ۾ هڪ ميکانيزم آهي، ان سان توهان ڪم ٺاهي سگهو ٿا جيڪي هڪ خاص وقت تي مڪمل ڪيا ويندا. يا ته هر 15-20-40 منٽ، يا هر خميس تي 15:30 تي يا ڪجهه ٻيو اختيار. انهن کي انگريزيءَ مان tracing paper به سڏيو وڃي ٿو - joba. جڏهن ته اسان اهو ڪم ڪري رهيا آهيون، مان جان بوجھ ڪري نئين مضمونن جي ڳولا ۾ هڪ نقص ڇڏي ڏيندس. اهو ڪافي ناياب آهي ۽ صرف هڪ صورتحال ۾ ظاهر ٿيو جڏهن مون دستي طور تي هن ڪم جي آپريشن کي جانچيو. هن کي ڪرڻ لاءِ توهان کي آرٽيڪل ڳولڻ لاءِ ڪلائنٽ لکڻ جي ضرورت آهي. ائين ڪرڻ لاءِ، اسان استعمال ڪنداسين Swagger API جيڪو اڳ ۾ ئي اسان کان واقف آهي . اتي هڪ پوسٽ ڪنٽرولر آهي. اسان صرف ڪجهه فلٽر استعمال ڪندي مضمونن جو مجموعو ڳولڻ ۾ دلچسپي رکون ٿا:
/api/1.0/rest/posts فلٽر ذريعي پوسٽون حاصل ڪريو
اسان هن درخواست سان ڪم ڪنداسين. اسان کي ان ۾ ڪهڙي ضرورت آهي؟ مضمونن جي هڪ فهرست حاصل ڪريو جيڪي هڪ مخصوص گروهه سان تعلق رکن ٿا، ۽ انهن کي اشاعت جي تاريخ موجب ترتيب ڏيڻ گهرجي. هن طريقي سان اسان آخري 15 آرٽيڪل وٺي سگهون ٿا ۽ چيڪ ڪري سگهون ٿا ته ڇا نوان پبليڪيشن شايع ڪيا ويا آهن اسان جي ڊيٽابيس مان lastArticleId جي بنياد تي. جيڪڏهن ڪو به آهي، اسان انهن کي پروسيسنگ ۽ صارف ڏانهن موڪلڻ لاء منتقل ڪنداسين. تنهنڪري اسان کي لکڻ جي ضرورت آهي JavaRushPostClient .

اسان لکون ٿا JavaRushPostClient

هتي اسان انهن سڀني درخواستن کي ڍڪڻ جي ڪوشش نه ڪنداسين جيڪي اسان ڏانهن API ۾ موڪليا ويا آهن ۽ صرف هڪ ٺاهينداسين جيڪا اسان کي گهربل آهي. ائين ڪرڻ سان، اسان هڪ ڀيرو ٻه مقصد حاصل ڪريون ٿا:
  1. اسان اسان جي درخواست لکڻ جي عمل کي تيز ڪريون ٿا.

  2. اسان هي ڪم انهن تي ڇڏي ڏيون ٿا جيڪي اسان جي ڪميونٽي جي مدد ڪرڻ چاهيندا آهن ۽ پاڻ کي ڊولپر جي حيثيت سان ڪوشش ڪرڻ جو فيصلو ڪن ٿا. مان ان لاءِ ڪم ڪندس جيڪي ايم وي پي کان پوءِ مڪمل ٿي سگهن ٿيون.

سو اچو ته اهو ڪريون. Swagger UI ۾ ماڊل سيڪشن جي پڇا ڳاڇا ڪرڻ لاءِ ، اسان ھيٺيون ڊي ٽي اوز ٺاھينداسين:"جاوا پروجيڪٽ A کان Z تائين": آرٽيڪلز ۾ ڪلائنٽ شامل ڪرڻ - 2

بنيادي استعمال ڪندڙ جي ڄاڻ:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

import lombok.Data;

/**
* DTO, which represents base user information.
*/
@Data
public class BaseUserInfo {
   private String city;
   private String country;
   private String displayName;
   private Integer id;
   private String job;
   private String key;
   private Integer level;
   private String pictureUrl;
   private String position;
   private UserPublicStatus publicStatus;
   private String publicStatusMessage;
   private Integer rating;
   private Integer userId;
}

ٻولي:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents languages.
*/
public enum Language {
   UNKNOWN,
   ENGLISH,
   GERMAN,
   SPANISH,
   HINDI,
   FRENCH,
   PORTUGUESE,
   POLISH,
   BENGALI,
   PUNJABI,
   CHINESE,
   ITALIAN,
   INDONESIAN,
   MARATHI,
   TAMIL,
   TELUGU,
   JAPANESE,
   KOREAN,
   URDU,
   TAIWANESE,
   NETHERLANDS,
   RUSSIAN,
   UKRAINIAN
}

پسند جي ڄاڻ:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents like's information.
*/
public class LikesInfo {

   private Integer count;
   private LikeStatus status;
}

پسند جي حالت:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents like's status.
*/
public enum LikeStatus {

   UNKNOWN,
   LIKE,
   HOT,
   FOLLOW,
   FAVORITE,
   SOLUTION,
   HELPFUL,
   ARTICLE,
   OSCAR,
   DISLIKE,
   WRONG,
   SPAM,
   ABUSE,
   FOUL,
   TROLLING,
   OFFTOPIC,
   DUPLICATE,
   DIRTY,
   OUTDATED,
   BORING,
   UNCLEAR,
   HARD,
   EASY,
   FAKE,
   SHAM,
   AWFUL
}

پوسٽ جو قسم:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents post types.
*/
public enum PostType {
   UNKNOWN, USUAL, INNER_LINK, OUTER_LINK
}

يوزر پبلڪ اسٽيٽس:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents user public status.
*/
public enum UserPublicStatus {
   UNKNOWN,
   BEGINNER,
   ACTIVE,
   STRONG,
   GRADUATED,
   INTERNSHIP_IN_PROGRESS,
   INTERNSHIP_COMPLETED,
   RESUME_COMPLETED,
   LOOKING_FOR_JOB,
   HAVE_JOB;
}

VisibilityStatus:
package com.github.javarushcommunity.jrtb.javarushclient.dto;

/**
* DTO, which represents visibility status.
*/
public enum VisibilityStatus {
   UNKNOWN,
   RESTRICTED,
   PUBLIC,
   PROTECTED,
   PRIVATE,
   DISABLED,
   DELETED
}
انهن سڀني ڊي ٽي اوز جي بنياد تي، اچو ته آرٽيڪل حاصل ڪرڻ لاءِ مکيه ڪلاس لکون:

پوسٽ ڄاڻ:

package com.github.javarushcommunity.jrtb.javarushclient.dto;

import lombok.Data;

/**
* DTO, which represents post information.
*/
@Data
public class PostInfo {

   private BaseUserInfo authorInfo;
   private Integer commentsCount;
   private String content;
   private Long createdTime;
   private String description;
   private GroupInfo groupInfo;
   private Integer id;
   private String key;
   private Language language;
   private LikesInfo likesInfo;
   private GroupInfo originalGroupInfo;
   private String pictureUrl;
   private Double rating;
   private Integer ratingCount;
   private String title;
   private PostType type;
   private Long updatedTime;
   private UserDiscussionInfo userDiscussionInfo;
   private Integer views;
   private VisibilityStatus visibilityStatus;

}
ھاڻي اچو ته ھڪ انٽرفيس ٺاھيون جنھن سان ڪم ڪرڻ ۽ ان تي عمل ڪرڻ. مضمونن سان ڪم ڪرڻ لاءِ اسان کي صرف ھڪڙي طريقي جي ضرورت پوندي:

JavaRushPostClient:

package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;

import java.util.List;

/**
* Client for Javarush Open API corresponds to Posts.
*/
public interface JavaRushPostClient {

   /**
    * Find new posts since lastPostId in provided group.
    *
    * @param groupId provided group ID.
    * @param lastPostId provided last post ID.
    * @return the collection of the new {@link PostInfo}.
    */
   List<PostInfo> findNewPosts(Integer groupId, Integer lastPostId);
}
findNewPosts ٻه دلائل وٺي ٿو: گروپ جي ID ۽ آرٽيڪل جي آخري ID جيڪا بوٽ اڳ ۾ ئي پوسٽ ڪئي آهي. تنهن ڪري، اهي سڀئي آرٽيڪل جيڪي آخري پوسٽ آئي ڊي سان آرٽيڪل کان پوء شايع ڪيا ويا آهن منتقل ڪيا ويندا . ۽ ان تي عملدرآمد:
package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import kong.unirest.GenericType;
import kong.unirest.Unirest;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;

import java.util.ArrayList;
import java.util.List;

@Component
public class JavaRushPostClientImpl implements JavaRushPostClient {

   private final String javarushApiPostPath;

   public JavaRushPostClientImpl(@Value("${javarush.api.path}") String javarushApi) {
       this.javarushApiPostPath = javarushApi + "/posts";
   }

   @Override
   public List<PostInfo> findNewPosts(Integer groupId, Integer lastPostId) {
       List<PostInfo> lastPostsByGroup = Unirest.get(javarushApiPostPath)
               .queryString("order", "NEW")
               .queryString("groupKid", groupId)
               .queryString("limit", 15)
               .asObject(new GenericType<List<PostInfo>>() {
               }).getBody();
       List<PostInfo> newPosts = new ArrayList<>();
       for (PostInfo post : lastPostsByGroup) {
           if (lastPostId.equals(post.getId())) {
               return newPosts;
           }
           newPosts.add(post);
       }
       return newPosts;
   }
}
اسان درخواست ۾ ڪيترائي فلٽر شامل ڪريون ٿا:
  • آرڊر = نئون - انهي ڪري ته لسٽ ۾ پهريون نئون شامل آهي؛
  • groupKid = groupId - صرف ڪجهه گروپن لاءِ ڳولھيو؛
  • حد = 15 - اسان هر درخواست تي آرٽيڪل جو تعداد محدود ڪريون ٿا. اسان جي تعدد 15-20 منٽ آهي ۽ اسان کي اميد آهي ته هن وقت دوران 15 (!) کان وڌيڪ نه لکيو ويندو.
اڳيون، جڏهن اسان کي آرٽيڪل مليا آهن، اسان لسٽ ذريعي هلون ٿا ۽ نوان ڳوليندا آهيون. الورورٿم سادو ۽ وجداني آهي. جيڪڏهن توهان ان کي بهتر ڪرڻ چاهيو ٿا، لکو). اچو ته هن ڪلائنٽ لاءِ هڪ سادي ٽيسٽ لکون:
package com.github.javarushcommunity.jrtb.javarushclient;

import com.github.javarushcommunity.jrtb.javarushclient.dto.PostInfo;
import org.junit.jupiter.api.Assertions;
import org.junit.jupiter.api.DisplayName;
import org.junit.jupiter.api.Test;

import java.util.List;

import static com.github.javarushcommunity.jrtb.javarushclient.JavaRushGroupClientTest.JAVARUSH_API_PATH;

@DisplayName("Integration-level testing for JavaRushPostClient")
class JavaRushPostClientTest {

   private final JavaRushPostClient postClient = new JavaRushPostClientImpl(JAVARUSH_API_PATH);

   @Test
   public void shouldProperlyGetNew15Posts() {
       //when
       List<PostInfo> newPosts = postClient.findNewPosts(30, 2935);

       //then
       Assertions.assertEquals(15, newPosts.size());
   }
}
اهو هڪ تمام سادو امتحان آهي جيڪو چيڪ ڪري ٿو ته ڇا ڪلائنٽ سان ڪو به رابطو آهي يا نه. هن کي جاوا پروجيڪٽ گروپ ۾ 15 نوان آرٽيڪل مليا آهن، ڇاڪاڻ ته مان هن کي هن گروپ ۾ پهرين آرٽيڪل جي سڃاڻپ ڏيان ٿو، ۽ انهن مان 15 کان وڌيڪ آهن... انهن مان 22 اڳ ۾ ئي آهن! مون سوچيو به نه هو ته انهن مان ايترا گهڻا هوندا. مون کي جلدي ڪيئن معلوم ڪيو؟ ڇا توهان سوچيو ته هو انهن کي ڳڻڻ ويو؟ نه) مون هڪ swager استعمال ڪيو ۽ هڪ خاص گروپ لاء آرٽيڪل جو تعداد ڏٺو. رستي ۾، توهان هن طريقي سان ٻين ۾ ڏسي سگهو ٿا... ۽ RANDOM گروپ ۾ ڪيترا آرٽيڪل آهن؟... مان توهان کي هاڻي ٻڌايان ٿو: انهن مان 1062 آهن! سنجيده رقم.

پهرئين حصي جي پڄاڻي

هتي اسان آرٽيڪل ذريعي ڪلائنٽ سان ڪم شامل ڪيو آهي. اسان اڳ ۾ ئي سڀ ڪجهه ڪيو آهي، هن ڀيري مان سمجهان ٿو ته هر شيء سادو ۽ جلدي هجڻ گهرجي. ايندڙ آرٽيڪل ۾ اسين اسپرنگ شيڊيولر شامل ڪنداسين ۽ FindNewArticleService لکنداسين . خير، هميشه وانگر، پسند ڪريو - سبسڪرائب ڪريو - گھنٽي وڄايو ، اسان جي پروجيڪٽ کي اسٽار ڏيو ، تبصرو لکو ۽ مضمون جي درجه بندي ڪريو! پڙهڻ لاء توهان سڀني جي مهرباني - توهان کي جلد ملندو!

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

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