Skip to content

Commit

Permalink
Added Character Search List
Browse files Browse the repository at this point in the history
  • Loading branch information
TrueMB committed Nov 8, 2021
1 parent b4cee29 commit 099e48c
Show file tree
Hide file tree
Showing 8 changed files with 189 additions and 3 deletions.
Original file line number Diff line number Diff line change
@@ -0,0 +1,51 @@
package me.proxer.library.api.list

import me.proxer.library.ProxerCall
import me.proxer.library.api.PagingLimitEndpoint
import me.proxer.library.entity.list.CharacterListEntry
import me.proxer.library.enums.DescriptionType

/**
* Search for all available characters. Features various filter and uses paging.
*
* @author TrueMB
*/
class CharacterSearchEndpoint internal constructor(
private val internalApi: InternalApi
) : PagingLimitEndpoint<List<CharacterListEntry>> {

private var page: Int? = null
private var limit: Int? = null

private var start: String? = null
private var contains: String? = null
private var search: String? = null
private var subject: DescriptionType? = null

override fun page(page: Int?) = this.apply { this.page = page }
override fun limit(limit: Int?) = this.apply { this.limit = limit }

/**
* Sets the start String to search for.
*/
fun start(start: String?) = this.apply { this.start = start }

/**
* Sets the contains String to search for.
*/
fun contains(contains: String?) = this.apply { this.contains = contains }

/**
* Sets the search String to search for in the descriptions.
*/
fun search(search: String?) = this.apply { this.search = search }

/**
* Sets the subject that should be looked in.
*/
fun subject(subject: DescriptionType?) = this.apply { this.subject = subject }

override fun build(): ProxerCall<List<CharacterListEntry>> {
return internalApi.characterSearch(start, contains, search, subject, page, limit)
}
}
12 changes: 12 additions & 0 deletions library/src/main/kotlin/me/proxer/library/api/list/InternalApi.kt
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package me.proxer.library.api.list

import me.proxer.library.ProxerCall
import me.proxer.library.entity.list.CharacterListEntry
import me.proxer.library.entity.list.IndustryCore
import me.proxer.library.entity.list.IndustryProject
import me.proxer.library.entity.list.MediaListEntry
Expand All @@ -9,6 +10,7 @@ import me.proxer.library.entity.list.TranslatorGroupCore
import me.proxer.library.entity.list.TranslatorGroupProject
import me.proxer.library.enums.Category
import me.proxer.library.enums.Country
import me.proxer.library.enums.DescriptionType
import me.proxer.library.enums.IndustryType
import me.proxer.library.enums.Language
import me.proxer.library.enums.LengthBound
Expand Down Expand Up @@ -63,6 +65,16 @@ internal interface InternalApi {
@Query("limit") limit: Int?
): ProxerCall<List<MediaListEntry>>

@GET("list/characters")
fun characterSearch(
@Query("start") start: String?,
@Query("contains") contains: String?,
@Query("search") search: String?,
@Query("subject") subject: DescriptionType?,
@Query("page") page: Int?,
@Query("limit") limit: Int?
): ProxerCall<List<CharacterListEntry>>

@GET("list/translatorgroups")
fun translatorGroupList(
@Query("start") searchStart: String?,
Expand Down
7 changes: 7 additions & 0 deletions library/src/main/kotlin/me/proxer/library/api/list/ListApi.kt
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,13 @@ class ListApi internal constructor(retrofit: Retrofit) {

private val internalApi = retrofit.create(InternalApi::class.java)

/**
* Returns the respective endpoint.
*/
fun characterSearch(): CharacterSearchEndpoint {
return CharacterSearchEndpoint(internalApi)
}

/**
* Returns the respective endpoint.
*/
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ import java.util.Date
* @property birthday The birthday.
* @property height The height.
* @property weight The weight.
* @property description The description.
* @property descriptions The description.
* @property persons The persons in contact with the character
*
* @author Ruben Gees
Expand All @@ -33,6 +33,6 @@ data class Character(
@Json(name = "birthday") val birthday: Date,
@Json(name = "height") val height: String,
@Json(name = "weight") val weight: String,
@Json(name = "description") val description: Set<Description>,
@Json(name = "description") val descriptions: Set<Description>,
@Json(name = "persons") val persons: Set<PersonCore>
) : ProxerIdItem
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
package me.proxer.library.entity.list

import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
import me.proxer.library.entity.ProxerIdItem

/**
* Entity holding all relevant info about a single entry of the character list.
*
* @property name The name.
* @property description The description.
*
* @author TrueMB
*/
@JsonClass(generateAdapter = true)
data class CharacterListEntry(
@Json(name = "id") override val id: String,
@Json(name = "name") val name: String,
@Json(name = "text") val description: String
) : ProxerIdItem
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ class CharacterCoreEndpointTest : ProxerTest() {
birthday = Date(709164000000L),
height = "176",
weight = "79",
description = setOf(
descriptions = setOf(
Description(
descriptionType = DescriptionType.INTRO,
text = "Lorenor Zorro ist ein Pirat aus der Serie One Piece. Er ist Mitglied der Strohhutbande " +
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,55 @@
package me.proxer.library.api.list

import me.proxer.library.ProxerTest
import me.proxer.library.entity.list.CharacterListEntry
import me.proxer.library.enums.DescriptionType
import me.proxer.library.runRequest
import org.amshove.kluent.shouldBeEqualTo
import org.junit.jupiter.api.Test

/**
* @author TrueMB
*/
class CharacterSearchEndpointTest : ProxerTest() {

private val expectedEntry = CharacterListEntry(
id = "108",
name = "Asuna Yuuki",
description = "[b]Asuna Yuuki[/b] ist die Freundin von [url=http://proxer.me/character?id=43#top][i]" +
"Kirito[/i][/url] und bildet gemeinsam mit ihm den Kopf der Gilde [i]Ritter des Blutschwurs[/i]. " +
"Es ist eine mittelgroße Gilde von etwa dreißig Spielern, die auch als die stärkste Gilde in " +
"[i]Aincrad[/i] bekannt ist. Sie ist eine erfahrene Spielerin, welche den Titel [i]Flash[/i] " +
"für ihre außergewöhnlichen schnellen Schwertfertigkeiten verdient hat."
)

@Test
fun testDefault() {
val (result, _) = server.runRequest("character_list_entry.json") {
api.list
.characterSearch()
.build()
.safeExecute()
}

result.first() shouldBeEqualTo expectedEntry
}

@Test
fun testPath() {
val (_, request) = server.runRequest("character_list_entry.json") {
api.list.characterSearch()
.start("Asu")
.contains("na")
.search("hellbraunes")
.subject(DescriptionType.APPEARANCE)
.limit(10)
.page(3)
.build()
.execute()
}

request.path shouldBeEqualTo """
/api/v1/list/characters?start=Asu&contains=na&search=hellbraunes&subject=appearance&page=3&limit=10
""".trimIndent().replace("\n", "")
}
}
41 changes: 41 additions & 0 deletions library/src/test/resources/character_list_entry.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,41 @@
{
"error": 0,
"message": "Abfrage erfolgreich",
"data": [
{
"id": "108",
"name": "Asuna Yuuki",
"text": "[b]Asuna Yuuki[/b] ist die Freundin von [url=http://proxer.me/character?id=43#top][i]Kirito[/i][/url] und bildet gemeinsam mit ihm den Kopf der Gilde [i]Ritter des Blutschwurs[/i]. Es ist eine mittelgroße Gilde von etwa dreißig Spielern, die auch als die stärkste Gilde in [i]Aincrad[/i] bekannt ist. Sie ist eine erfahrene Spielerin, welche den Titel [i]Flash[/i] für ihre außergewöhnlichen schnellen Schwertfertigkeiten verdient hat."
},
{
"id": "3576",
"name": "Asuka Kudou",
"text": "[B]Asuka Kudou[/B] ist das zweite Kind, das aus der anderen Welt herbeigerufen wird. Sie ist ein junges Mädchen aus einer reichen Familie zur Zeit des Zweiten Weltkrieges, zählt aber heute zu den Kernmitgliedern der [I]Gemeinschaft No Name[/I]."
},
{
"id": "2033",
"name": "Asuka Kurashina",
"text": "[b]Asuka Kurashina[/b] ist gerade erst auf die Insel [i]Kunashima[/i] und geht dort auf die [i]Kunahama Akademie[/i]."
},
{
"id": "882",
"name": "Asuka Langley Soryuu",
"text": "[b]Asuka Langley Soryu[/b] ist das Kind eines Amerikaners mit einer Japanisch-Deutschen Mutter. Sie ist das zweite Kind das den Evangelion Unit 02 steuert."
},
{
"id": "2105",
"name": "Asukai Katsu",
"text": "[b]Asukai Katsu[/b] ist der König. Er gibt sich jedoch als ein Teil des inneren Kernes aus, um sich zu schützen."
},
{
"id": "4161",
"name": "Asuma Mutsumi",
"text": "[B]Asuma Mutsumi[/B] ist im dritten Semester auf der gleichen Schule wie [URL=https://proxer.me/character?id=3495#top][I]Kae[/I][/URL], welche er, zusammen mit weiteren drei Jungen, umwirbt."
},
{
"id": "4046",
"name": "Asura",
"text": "[B]Asura[/B] ist einer der zwölf Dämonen, mit denen [URL=https://proxer.me/character?id=3811#top][I]Kagemitsu Daigo[/I][/URL] einen Pakt geschlossen hat."
}
]
}

0 comments on commit 099e48c

Please sign in to comment.