JavaRush /Blog Jawa /Random-JV /Nambahake klien menyang artikel - "Proyek Jawa saka A nga...

Nambahake klien menyang artikel - "Proyek Jawa saka A nganti Z"

Diterbitake ing grup
Halo kabeh, kanca-kanca sing daktresnani. Langkah demi langkah kita nyedhak menyang target - dadi MVP proyek kita - JavaRush Telegram Bot. Kaya sing dakkandhakake ing artikel pungkasan, mung ana 5 tugas. Dina iki kita bakal nutupi loro. "Proyek Jawa saka A nganti Z": Nambahake klien menyang artikel - 1Aku pengin mbaleni manawa proyek kasebut ora bakal rampung ing kene. Aku isih duwe ton gagasan lan visi babagan carane proyek iki kudu berkembang, apa sing bisa ditambahake, apa sing bisa ditindakake kanthi luwih apik. Sadurunge MVP, kita bakal nggawe artikel kapisah babagan topik refactoring - yaiku, babagan ningkatake kualitas kode tanpa ngganti fungsine. Ing wektu kasebut, kabeh proyek bakal katon lan bakal jelas apa lan ing endi sing bisa ditingkatake. Ing kasus kita, kita bakal dilindhungi kanthi maksimal supaya ora nglanggar fungsi kasebut, amarga akeh tes wis ditulis. Kita uga bakal nulis retrospektif babagan apa sing dikarepake lan pungkasane. Iki minangka perkara sing migunani banget: ayo ndeleng kepiye kabeh katon nem wulan kepungkur. Paling ora iki menarik banget kanggo aku. Yen ana wong sing pengin nyoba dhewe minangka tester manual, tulisake menyang kita lan kita bakal kerja sama. Ayo dadi luwih apik proyek iki bebarengan! Dadi, iki: rong tugas sing diterangake nem wulan kepungkur: JRTB-8 lan JRTB-9 . Aku miwiti ndeleng apa sing kudu dileksanakake kanggo tugas-tugas kasebut, lan nyadari yen babagan ngluncurake perintah, kabeh wis siyap. Iku kedadeyan ...) Ing kene, sampeyan bisa ndeleng ing StartCommand , cara eksekusi :
@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 bisa digunakake ing kene: yen database kita wis duwe pangguna kaya chatId, kita mung nyetel kolom aktif = bener kanggo dheweke. Lan yen ora ana pangguna kasebut, kita nggawe sing anyar. Padha kanggo perintah / stop ing StopCommand :
@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);
}
Bisa dideleng yen nalika nelpon printah iki, mung aktif = kolom palsu disetel kanggo pangguna. Lan kabeh iki: langganane bakal urip lan ngenteni ing swiwi nalika pangguna mutusake maneh kanggo ngaktifake obrolan karo bot. Lan misale jek tugas wis rampung lan bisa ditutup. Nanging ora ana. Tugas sing paling penting yaiku nggawe tandha babagan artikel anyar ing langganan. Iki ngendi tugas iki bakal rampung dianyari lan rampung. Tegese, nganti kita wis ngetrapake kabar babagan artikel anyar, ora bisa ditutup. Mula, ayo nindakake tugas JRTB-4 - nggawe cek saben 20 menit lan kabar babagan artikel anyar. Kanca-kanca! Apa sampeyan pengin ngerti langsung nalika kode anyar kanggo proyek kasebut dirilis? Kapan artikel anyar metu? Join channel tg aku . Ing kana aku ngumpulake artikelku, pikiranku, pangembangan open-source bebarengan.

Kita ngleksanakake JRTB-4

Apa sing kudu ditindakake minangka bagean saka tugas iki:
  1. Nggawe proyek sing periodik bakal ngunjungi kabeh grup sing kita duwe langganan ing database, urut artikel miturut tanggal publikasi lan mriksa apa ID saka publikasi pungkasan cocog karo nilai ing GroupSub. Yen ora cocog, sampeyan kudu ngerti persis carane akeh artikel sing wis diterbitake wiwit pungkasan. Kita nganyari last_article_id ing GroupSub7 menyang kahanan saiki.

  2. Nalika kita nemokake dhaptar artikel sing diterbitake, kita nemokake kabeh pangguna AKTIF kanggo grup kasebut lan ngirim kabar babagan artikel anyar.

Kanggo nindakake iki, kita bakal nggunakake barang kaya Spring Scheduler. Iki minangka mekanisme ing Spring Framework, kanthi sampeyan bisa nggawe tugas sing bakal ditindakake ing wektu tartamtu. Saben menit 15-20-40, utawa saben Kemis jam 15:30 utawa sawetara pilihan liyane. Padha uga disebut tracing paper saka basa Inggris - joba. Nalika kita nindakake tugas iki, aku bakal sengaja ninggalake siji cacat ing panelusuran artikel anyar. Cukup langka lan mung katon ing kahanan sing aku nyoba kanthi manual operasi tugas iki. Kanggo nindakake iki, sampeyan kudu nulis klien kanggo nggoleki artikel. Kanggo nindakake iki, kita bakal nggunakake API Swagger sing wis akrab karo kita . Ana post-kontroler. Kita mung kepengin nggoleki koleksi artikel nggunakake saringan tartamtu:
/api/1.0/rest/posts Entuk kiriman kanthi saringan
Kita bakal bisa karo panjalukan iki. Apa sing kita butuhake? Entuk dhaptar artikel sing kalebu klompok tartamtu, lan kudu diurutake miturut tanggal publikasi. Kanthi cara iki kita bisa njupuk 15 artikel pungkasan lan mriksa apa publikasi anyar wis diterbitake adhedhasar lastArticleId saka database kita. Yen ana, bakal diterusake kanggo diproses lan dikirim menyang pangguna. Dadi kita kudu nulis JavaRushPostClient .

Kita nulis JavaRushPostClient

Ing kene kita ora bakal nyoba kanggo nutupi kabeh panjalukan sing dikirim menyang kita ing API lan mung bakal nggawe sing dibutuhake. Kanthi nindakake iki, kita entuk rong tujuan bebarengan:
  1. Kita nyepetake proses nulis aplikasi kita.

  2. Kita ninggalake karya iki kanggo wong-wong sing pengin mbantu masyarakat lan mutusake kanggo nyoba dhewe minangka pangembang. Aku bakal nggawe tugas kanggo iki sing bisa rampung sawise MVP.

Dadi ayo nglakoni. Kanggo pitakon bagean Model ing Swagger UI, kita bakal nggawe DTO ing ngisor iki:"Proyek Jawa saka A nganti Z": Nambahake klien menyang artikel - 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;
}

Basa:

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
}

LikesInfo:

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
}

Tipe Pos:

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

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

UserPublicStatus:

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
}
Adhedhasar kabeh DTO iki, ayo nulis kelas utama kanggo nampa artikel:

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;

}
Saiki ayo nggawe antarmuka sing bisa digunakake lan implementasine. Kita mung butuh siji cara kanggo nggarap artikel:

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 njupuk rong argumen: ID grup lan ID pungkasan artikel sing wis dikirim bot. Mulane, kabeh artikel sing diterbitake luwih saka artikel karo lastPostId bakal dikirim . Lan implementasine:
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;
   }
}
Kita nambah sawetara saringan menyang panyuwunan:
  • pesenan = NEW - supaya dhaptar ngemot sing anyar dhisik;
  • groupKid = groupId - golek mung kanggo grup tartamtu;
  • watesan = 15 - kita matesi jumlah artikel saben request. Frekuensi kita yaiku 15-20 menit lan kita ngarepake yen ing wektu iki ora luwih saka 15 (!) bakal ditulis.
Sabanjure, yen wis nemokake artikel, kita mbukak dhaptar lan golek sing anyar. Algoritma iku prasaja lan intuisi. Yen sampeyan pengin nambah, nulis). Ayo nulis tes prasaja kanggo klien iki:
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());
   }
}
Iki minangka tes sing gampang banget sing mriksa manawa ana komunikasi karo klien utawa ora. Dheweke nemokake 15 artikel anyar ing grup proyek Java, amarga aku menehi ID artikel pisanan ing grup iki, lan wis ana luwih saka 15 ... Wis ana 22! Aku malah ora ngira bakal akeh banget. Kepiye carane aku ngerti kanthi cepet? Apa sampeyan mikir dheweke lunga ngetung? Ora) Aku nggunakake swager lan ndeleng jumlah artikel kanggo klompok tartamtu. Ngomong-ngomong, sampeyan bisa ndeleng cara iki ing wong liya ... Lan pirang-pirang artikel ing grup RANDOM? ... Aku bakal pitutur marang kowe saiki: ana 1062! Jumlah sing serius.

Pungkasan bagean pisanan

Ing kene kita wis nambahake karya karo klien kanthi artikel. Kita wis rampung kabeh, wektu iki aku kabeh kudu prasaja lan cepet. Ing artikel sabanjure kita bakal nambah Spring Scheduler lan nulis FindNewArticleService . Inggih, kaya biasane, kaya - langganan - muni lonceng , menehi proyek kita lintang , nulis komentar lan menehi rating artikel! Matur nuwun kanggo kabeh sing wis maca - nganti ketemu!

Dhaptar kabeh materi ing seri kasebut ana ing wiwitan artikel iki.

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