Skip to content

Commit 053dd41

Browse files
authored
release: 1.0.2 (#220)
2 parents 97a3f3a + 00089f9 commit 053dd41

File tree

102 files changed

+2397
-104
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

102 files changed

+2397
-104
lines changed
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
package org.gitanimals.guild.app
2+
3+
import org.gitanimals.guild.domain.GuildService
4+
import org.gitanimals.guild.domain.GuildService.Companion.loadMembers
5+
import org.gitanimals.render.app.DrawGuildFacade
6+
import org.springframework.stereotype.Service
7+
8+
@Service
9+
class DrawGuildProxy(
10+
private val guildService: GuildService,
11+
private val renderDrawGuildFacade: DrawGuildFacade,
12+
) {
13+
14+
fun drawGuild(id: Long): String {
15+
val guild = guildService.getGuildById(id, loadMembers)
16+
17+
return renderDrawGuildFacade.drawGuild(
18+
title = guild.getTitle(),
19+
totalContributions = guild.getTotalContributions(),
20+
guildFarmType = guild.getGuildFarmType(),
21+
userIds = guild.getMembers().map { it.userId } + guild.getLeaderUserId(),
22+
personaIds = guild.getMembers().map { it.personaId } + guild.getLeaderPersonaId(),
23+
)
24+
}
25+
}

โ€Žsrc/main/kotlin/org/gitanimals/guild/app/JoinGuildFacade.ktโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,7 @@ class JoinGuildFacade(
6969
) {
7070
sagaManager.startSync(
7171
InboxInputEvent.guildJoinRequest(
72-
userId = guild.getLeaderId(),
72+
userId = guild.getLeaderUserId(),
7373
newUserImage = member.profileImage,
7474
newUserName = member.username,
7575
guildTitle = guild.getTitle(),

โ€Žsrc/main/kotlin/org/gitanimals/guild/controller/GuildController.ktโ€Ž

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ class GuildController(
2727
private val searchGuildFacade: SearchGuildFacade,
2828
private val changeMainPersonaFacade: ChangeMainPersonaFacade,
2929
private val leaveGuildFacade: LeaveGuildFacade,
30+
private val drawGuildProxy: DrawGuildProxy,
3031
) {
3132

3233
@ResponseStatus(HttpStatus.OK)
@@ -135,4 +136,9 @@ class GuildController(
135136
@RequestHeader(HttpHeaders.AUTHORIZATION) token: String,
136137
@PathVariable("guildId") guildId: Long,
137138
) = leaveGuildFacade.leave(token, guildId)
139+
140+
@GetMapping("/guilds/{guildId}/draw")
141+
fun draw(
142+
@PathVariable("guildId") guildId: Long,
143+
) = drawGuildProxy.drawGuild(guildId)
138144
}

โ€Žsrc/main/kotlin/org/gitanimals/guild/controller/response/GuildResponse.ktโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@ data class GuildResponse(
5656
body = guild.getBody(),
5757
guildIcon = guild.getGuildIcon(),
5858
leader = Leader(
59-
userId = guild.getLeaderId().toString(),
59+
userId = guild.getLeaderUserId().toString(),
6060
name = guild.getLeaderName(),
6161
contributions = guild.getContributions().toString(),
6262
personaId = guild.getLeaderPersonaId().toString(),

โ€Žsrc/main/kotlin/org/gitanimals/guild/domain/Guild.ktโ€Ž

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -101,7 +101,7 @@ class Guild(
101101
waitMembers.add(waitMember)
102102
}
103103

104-
fun getLeaderId(): Long = leader.userId
104+
fun getLeaderUserId(): Long = leader.userId
105105

106106
fun accept(acceptUserId: Long) {
107107
val acceptUser = waitMembers.firstOrNull { it.userId == acceptUserId } ?: return

โ€Žsrc/main/kotlin/org/gitanimals/guild/domain/GuildFarmType.ktโ€Ž

Lines changed: 136 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,141 @@ package org.gitanimals.guild.domain
22

33
enum class GuildFarmType {
44

5-
DUMMY,
5+
DUMMY {
6+
override fun loadComponent(name: String, commit: Long): String {
7+
return dummyGuildFieldSvg.replace(NAME_FIX, name.toSvg(0.0, 3.0))
8+
.replace(COMMIT_FIX, commit.toSvg("commit", 260.0, 4.0))
9+
}
10+
11+
override fun fillBackground(): String =
12+
"<rect x=\"0.5\" y=\"0.5\" width=\"599\" height=\"299\" rx=\"4.5\" fill=\"white\"/>"
13+
14+
override fun drawBorder(): String =
15+
"<rect x=\"0.5\" y=\"0.5\" width=\"599\" height=\"299\" rx=\"4.5\" stroke=\"#D9D9D9\" fill=\"none\"/>"
16+
},
617
;
18+
19+
abstract fun loadComponent(name: String, commit: Long): String
20+
21+
abstract fun fillBackground(): String
22+
23+
abstract fun drawBorder(): String
24+
25+
private companion object {
26+
private const val NAME_FIX = "*{username}"
27+
private const val COMMIT_FIX = "*{commit-count}"
28+
private const val VISIT_FIX = "*{visit-count}"
29+
30+
private val largeTextWidth = mapOf(
31+
"A" to 20.0,
32+
"B" to 20.0,
33+
"C" to 20.0,
34+
"D" to 20.0,
35+
"E" to 20.0,
36+
"F" to 20.0,
37+
"G" to 20.0,
38+
"H" to 20.0,
39+
"I" to 14.0,
40+
"J" to 20.0,
41+
"K" to 20.0,
42+
"L" to 20.0,
43+
"M" to 23.0,
44+
"N" to 23.0,
45+
"O" to 20.0,
46+
"P" to 20.0,
47+
"Q" to 20.0,
48+
"R" to 20.0,
49+
"S" to 20.0,
50+
"T" to 20.0,
51+
"U" to 20.0,
52+
"V" to 20.0,
53+
"W" to 23.0,
54+
"X" to 20.0,
55+
"Y" to 20.0,
56+
"Z" to 20.0,
57+
"-" to 20.0,
58+
"a" to 20.0,
59+
"b" to 20.0,
60+
"c" to 20.0,
61+
"d" to 20.0,
62+
"e" to 20.0,
63+
"f" to 20.0,
64+
"g" to 20.0,
65+
"h" to 20.0,
66+
"i" to 20.0,
67+
"j" to 17.0,
68+
"k" to 20.0,
69+
"l" to 20.0,
70+
"m" to 23.0,
71+
"n" to 20.0,
72+
"o" to 20.0,
73+
"p" to 20.0,
74+
"q" to 20.0,
75+
"r" to 20.0,
76+
"s" to 20.0,
77+
"t" to 20.0,
78+
"u" to 20.0,
79+
"v" to 20.0,
80+
"w" to 23.0,
81+
"x" to 20.0,
82+
"y" to 23.0,
83+
"z" to 20.0,
84+
"0" to 20.0,
85+
"1" to 17.0,
86+
"2" to 20.0,
87+
"3" to 20.0,
88+
"4" to 23.0,
89+
"5" to 20.0,
90+
"6" to 20.0,
91+
"7" to 20.0,
92+
"8" to 20.0,
93+
"9" to 20.0,
94+
)
95+
96+
private val mediumNumberWidth = listOf(
97+
11.0,
98+
9.0,
99+
11.0,
100+
11.0,
101+
12.0,
102+
11.0,
103+
11.0,
104+
11.0,
105+
11.0,
106+
11.0,
107+
)
108+
109+
private fun String.toSvg(startX: Double, xIncrease: Double): String {
110+
val builder = StringBuilder()
111+
var currentX = startX
112+
this.forEach { char ->
113+
val largeTextSvg = largeTextSvgs[char.toString()]
114+
val index = char - 'A'
115+
116+
val charWidth = largeTextWidth[char.toString()]
117+
?: throw IllegalArgumentException("Cannot find matched charWidth by \"$char\"")
118+
119+
builder.append("<g id=\"name$index\" transform=\"translate($currentX, 2)\">")
120+
.append(largeTextSvg)
121+
.append("</g>")
122+
123+
currentX += xIncrease + charWidth
124+
}
125+
return builder.toString()
126+
}
127+
128+
private fun Long.toSvg(id: String, startX: Double, xIncrease: Double): String {
129+
val builder = StringBuilder()
130+
var currentX = startX
131+
this.toString().forEach { char ->
132+
val index = char.digitToInt()
133+
val mediumNumberSvg = mediumNumberSvgs[index]
134+
builder.append("<g id=\"$id$index\" transform=\"translate($currentX, 0)\">")
135+
.append(mediumNumberSvg)
136+
.append("</g>")
137+
currentX += xIncrease + mediumNumberWidth[index]
138+
}
139+
return builder.toString()
140+
}
141+
}
7142
}
Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
package org.gitanimals.guild.domain
2+
3+
import org.springframework.core.io.ClassPathResource
4+
import java.nio.charset.Charset
5+
6+
val dummyGuildFieldSvg: String = ClassPathResource("persona/field/white-field.svg")
7+
.getContentAsString(Charset.defaultCharset())
8+
9+
val largeTextSvgs = lazy {
10+
val map = mutableMapOf<String, String>()
11+
for (i in 'A'..'Z') {
12+
val path = "persona/text/large/$i.svg"
13+
map[i.toString()] = ClassPathResource(path)
14+
.getContentAsString(Charset.defaultCharset())
15+
}
16+
for (i in 'a'..'z') {
17+
val path = "persona/text/large/_$i.svg"
18+
map[i.toString()] = ClassPathResource(path)
19+
.getContentAsString(Charset.defaultCharset())
20+
}
21+
for (i in 0..9) {
22+
val path = "persona/text/large/$i.svg"
23+
map[i.toString()] = ClassPathResource(path)
24+
.getContentAsString(Charset.defaultCharset())
25+
}
26+
map["-"] = ClassPathResource("persona/text/large/hyphens.svg")
27+
.getContentAsString(Charset.defaultCharset())
28+
map
29+
}.value
30+
31+
val mediumNumberSvgs = lazy {
32+
val list = mutableListOf<String>()
33+
for (i in 0..9) {
34+
val path = "persona/text/medium/$i.svg"
35+
list.add(
36+
ClassPathResource(path)
37+
.getContentAsString(Charset.defaultCharset())
38+
)
39+
}
40+
list
41+
}.value
42+
43+
val numberSvgs = lazy {
44+
val list = mutableListOf<String>()
45+
for (i in 0..9) {
46+
val path = "persona/text/small/$i.svg"
47+
list.add(
48+
ClassPathResource(path)
49+
.getContentAsString(Charset.defaultCharset())
50+
)
51+
}
52+
list
53+
}.value
54+
Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
package org.gitanimals.render.app
2+
3+
import org.gitanimals.guild.domain.GuildFarmType
4+
import org.gitanimals.render.domain.Mode
5+
import org.gitanimals.render.domain.UserService
6+
import org.springframework.stereotype.Service
7+
8+
@Service
9+
class DrawGuildFacade(
10+
private val userService: UserService,
11+
) {
12+
13+
fun drawGuild(
14+
title: String,
15+
totalContributions: Long,
16+
guildFarmType: GuildFarmType,
17+
userIds: List<Long>,
18+
personaIds: List<Long>,
19+
): String {
20+
val users = userService.findAllUsersByIdWithContributions(userIds.toSet())
21+
22+
val svgBuilder = StringBuilder().openGuild()
23+
.append(guildFarmType.fillBackground())
24+
25+
val personaSvgs = users.flatMap { user ->
26+
user.personas.filter { persona ->
27+
persona.id in personaIds
28+
}.map { persona ->
29+
persona.toSvgForce(Mode.NAME_WITH_LEVEL)
30+
}
31+
}
32+
33+
personaSvgs.forEach { svgBuilder.append(it) }
34+
35+
return svgBuilder.append(guildFarmType.loadComponent(title, totalContributions))
36+
.append(guildFarmType.drawBorder())
37+
.closeGuild()
38+
}
39+
40+
private fun StringBuilder.openGuild(): StringBuilder =
41+
this.append("<svg width=\"600\" height=\"300\" viewBox=\"0 0 600 300\" fill=\"none\" xmlns=\"http://www.w3.org/2000/svg\">")
42+
43+
private fun StringBuilder.closeGuild(): String = this
44+
.append("</svg>")
45+
.toString()
46+
47+
}
48+
49+

โ€Žsrc/main/kotlin/org/gitanimals/render/domain/Mode.ktโ€Ž

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,5 +4,6 @@ enum class Mode {
44
FARM,
55
LINE,
66
LINE_NO_CONTRIBUTION,
7+
NAME_WITH_LEVEL,
78
;
89
}

0 commit comments

Comments
ย (0)