JavaRush /Java Blog /Random-TK /Makalalara müşderi goşmak - "Java taslamasy A-dan Z"

Makalalara müşderi goşmak - "Java taslamasy A-dan Z"

Toparda çap edildi
Hemmelere salam, eziz dostlarym. Stepdim-ädim maksadymyza has ýakynlaşýarys - taslamamyzyň MVP bolmagy - JavaRush Telegram Bot. Geçen makalada aýdyşym ýaly, bary-ýogy 5 mesele galdy. Bu gün olaryň ikisini ara alyp maslahatlaşarys. "Java-dan A-dan Z" taslamasy: Makalalara müşderi goşmak - 1Taslamanyň şu ýerde gutarmajakdygyny gaýtalasym gelýär. Bu taslamanyň nähili ösmelidigi, oňa täze zatlar goşup boljakdygy, has gowy edip boljakdygy barada henizem pikirlerim we pikirlerim bar. MVP-den öň, gaýtadan işlemek mowzugynda, ýagny işleýşini üýtgetmän koduň hilini ýokarlandyrmak barada aýratyn makala taýýarlarys. Şol wagta çenli ähli taslama görüner we nämäni we nirede gowulaşyp boljakdygy belli bolar. Biziň ýagdaýymyzda, köp synag ýazylandygy sebäpli, funksiýany bozmakdan iň ýokary derejede gorarys. Şeýle hem, islän zadymyz we ahyrynda näme alandygymyz barada retrospektiv ýazarys. Bu gaty peýdaly zat: geliň, alty aý mundan ozal hemme zadyň näderejede dogry görünendigini göreliň. Iň bärkisi bu meniň üçin gaty gyzykly. Kimdir biri özüni elde synag ediji hökmünde synap görmek islese, bize ýazyň we hyzmatdaş bolarys. Geliň, bu taslamany bilelikde has gowulaşdyralyň! Şeýlelikde, ine, olar: alty aý mundan ozal beýan edilen iki mesele: JRTB-8 we JRTB-9 . Bu meseleler üçin ýerine ýetirilmeli zatlara seredip başladym we buýruklary işe girizmek nukdaýnazaryndan hemme zadyň eýýäm taýyndygyna düşündim. Bolýar ...) Bu ýerde, ýerine ýetiriş usuly bolan “StartCommand” -a seredip bilersiňiz :
@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);
}
Logika şu ýerde işleýär: eger maglumat bazamyzda chatId arkaly şeýle ulanyjy bar bolsa, biz onuň üçin işjeň = hakyky meýdançany belläris. Şeýle ulanyjy ýok bolsa, täzesini döredýäris. StopCommand -da / stop buýrugy üçin birmeňzeş :
@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);
}
Bu buýruga jaň edende, ulanyjy üçin diňe işjeň = ýalan meýdan goýulýandygyny görmek bolýar. Munuň hemmesi: ulanyjy ýene-de bot bilen söhbetdeşligi işjeňleşdirmek kararyna gelende, abunalary ýaşar we ganatlarynda garaşar. We wezipe eýýäm ýerine ýetirilip, ýapylyp bilinjek ýaly. Emma ol ýerde ýokdy. Iň möhüm wezipe, abuna ýazylan täze makalalar barada duýduryş döretmekdir. Ine, bu meseleler doly täzelener we tamamlanar. Newagny, täze makalalar barada habarnamany durmuşa geçirýänçäk, ýapylyp bilinmez. Şonuň üçin geliň, JRTB-4 meselesine üns bereliň - her 20 minutdan bir çek we täze makalalar barada habarnamalar döredeliň. Dostlar! Taslama üçin täze kod çykanda derrew bilmek isleýärsiňizmi? Täze makala haçan çykýar? Tg kanalyma goşulyň . Şol ýerde makalalarymy, pikirlerimi, açyk çeşmeli ösüşimi bilelikde ýygnaýaryn.

JRTB-4 durmuşa geçirýäris

Bu meseläniň bir bölegi hökmünde etmeli zatlarymyz:
  1. Maglumatlar bazasyndaky abunalygymyz bolan ähli toparlara wagtal-wagtal baryp görjek, makalalary neşir edilen senesi boýunça tertipläň we soňky neşiriň şahsyýetnamasynyň GroupSub-daky bahasyna laýyk gelýändigini barlaň. Gabat gelmeýän bolsa, soňky gezekden bäri näçe makalanyň çap edilendigini anyk düşünmeli. GroupSub7-de last_article_id-i häzirki ýagdaýa täzeleýäris.

  2. Neşir edilen makalalaryň sanawyny tapanymyzda, bu toparlar üçin ähli ACTIVE ulanyjylaryny tapýarys we täze makalalar barada habarnamalary iberýäris.

Munuň üçin Bahar meýilnamasy ýaly bir zady ulanarys. Bu, bahar çarçuwasyndaky mehanizm, onuň bilen belli bir wagtda ýerine ýetiriljek meseleleri döredip bilersiňiz. Everya her 15-20-40 minutda, ýa-da her penşenbe güni 15:30 ýa-da başga bir wariant. Iňlis dilinden gözleg kagyzy - joba hem diýilýär. Bu meseläni ýerine ýetirýän wagtymyz, täze makalalary gözlemekde bilkastlaýyn bir kemçiligi goýaryn. Bu gaty seýrek we diňe bu meseläniň işleýşini el bilen synagdan geçiren ýagdaýymda ýüze çykdy. Munuň üçin makala gözlemek üçin müşderi ýazmaly. Munuň üçin eýýäm bize tanyş bolan Swagger API ulanarys . Dolandyryjy bar. Diňe käbir süzgüçleri ulanyp, makalalar ýygyndysyny gözlemek isleýäris:
/api/1.0/rest/posts Filtrler arkaly ýazgy alyň
Bu haýyş bilen işläris. Onda bize näme gerek? Belli bir topara degişli makalalaryň sanawyny alyň we neşir edilen senesi boýunça tertiplenmeli. Şeýlelik bilen, soňky 15 makalany alyp, maglumatlar bazamyzdaky iň soňky makalaId esasynda täze neşirleriň çap edilendigini ýa-da ýokdugyny barlap bileris . Eger bar bolsa, olary gaýtadan işlemek we ulanyja ibermek üçin bereris. Şonuň üçin JavaRushPostClient ýazmaly .

JavaRushPostClient ýazýarys

Bu ýerde, API-de bize iberilen ähli islegleri ýapmaga synanyşmarys we diňe zerur zatlary dörederis. Şeýle etmek bilen birbada iki maksada ýetýäris:
  1. Arzamyzy ýazmak prosesini çaltlaşdyrýarys.

  2. Bu eseri jemgyýetimize kömek etmek isleýän we özlerini dörediji hökmünde synap görmek isleýänlere goýýarys. MVP-den soň gutaryp boljak bu meseläni ýerine ýetirerin.

Geliň, muny edeliň. Swagger UI -de Modeller bölümini soramak üçin aşakdaky DTO-lary dörederis:"A-dan Z-a Java taslamasy": Makalalara müşderi goşmak - 2

BaseUserInfo:

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;
}

Dil:

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
}

Halaýanlar:

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

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

   private Integer count;
   private LikeStatus status;
}

LikeStatus:

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
}

Post görnüşi:

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

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

UlanyjyPublicStatus:

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
}
Bu DTO-laryň hemmesine esaslanyp, makalalary almak üçin esasy synp ýazalyň:

PostInfo:

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;

}
Indi işlemek we ony durmuşa geçirmek üçin interfeýs döredeliň. Makalalar bilen işlemek üçin diňe bir usul gerek bolar:

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 iki argument alýar: topar ID we botyň eýýäm iberen makalasynyň soňky şahsyýetnamasy. Şol sebäpden, soňkyPostId bilen makaladan has soň çap edilen makalalaryň hemmesi iberiler . Ony durmuşa geçirmek:
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;
   }
}
Haýyşa birnäçe süzgüç goşýarys:
  • sargyt = T NEWZE - sanawda ilki täzeleri öz içine alar ýaly;
  • groupKid = groupId - diňe belli toparlary gözläň;
  • limit = 15 - haýyş boýunça makalalaryň sanyny çäklendirýäris. Frequygylygymyz 15-20 minut, bu döwürde 15 (!) KÖP KÖP ýazylmaz diýip garaşýarys.
Ondan soň, makalalary tapanymyzdan soň, sanawdan geçýäris we täzesini gözleýäris. Algoritm ýönekeý we içgin. Gowulaşdyrmak isleseňiz ýazyň). Bu müşderi üçin ýönekeý synag ýazalyň:
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());
   }
}
Bu, müşderi bilen asla aragatnaşygyň bardygyny ýa-da ýokdugyny barlaýan gaty ýönekeý synag. Java taslamalar toparynda 15 sany täze makala tapýar, sebäbi men oňa bu topardaky ilkinji makalanyň şahsyýetini berýärin, eýýäm 15-den gowragy bar ... Olardan eýýäm 22-si bar! Olaryň köpüsi bolar öýdemokdym. Nädip bildim? Olary sanamaga gitdi öýdýärsiňizmi? Opeok) Men swager ulandym we belli bir topar üçin makalalaryň sanyna seretdim. Theeri gelende aýtsak, beýlekilere şeýle seredip bilersiňiz ... RANDOM toparynda näçe makala bar? ... Indi size aýdaýyn: olardan 1062-si bar! Çynlakaý mukdar.

Birinji bölümiň soňy

Bu ýerde müşderi bilen makala boýunça iş goşduk. Biz eýýäm hemme zady etdik, bu gezek hemme zat ýönekeý we çalt bolmaly diýip pikir edýärin. Indiki makalada Bahar meýilnamasyny goşarys we FindNewAr ArticleService ýazarys . Bolýar, hemişeki ýaly, ýazylmak - jaňy jaň etmek , taslamamyza ýyldyz bermek , teswir ýazmak we makala baha bermek! Okanyňyz üçin hemmäňize sag bolsun aýdýaryn - ýakyn wagtda görüşeris!

Tapgyryň ähli materiallarynyň sanawy bu makalanyň başynda.

Teswirler
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION