Skip to content

Commit 30479c2

Browse files
committed
release(1.2.2): Add Author Request Schema
1 parent dcb7d32 commit 30479c2

File tree

3 files changed

+197
-1
lines changed

3 files changed

+197
-1
lines changed

src/main/kotlin/io/codemc/api/database/database.kt

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -54,6 +54,8 @@ fun connect(): Database {
5454
return database
5555
}
5656

57+
// Users
58+
5759
/**
5860
* Adds a user to the database.
5961
* @param username The username of the jenkins user
@@ -134,4 +136,90 @@ fun removeUser(
134136
fun removeAllUsers() = transaction(database) {
135137
if (!Users.exists()) return@transaction 0
136138
Users.deleteAll()
139+
}
140+
141+
// Requests
142+
143+
/**
144+
* Adds a request to the database.
145+
* @param messageId The unique ID of the request according to Discord
146+
* @param userId The unique ID of the Discord user
147+
* @param githubName The GitHub username of the user
148+
* @param repoName The name of the repository
149+
* @return The result of the `INSERT` statement
150+
*/
151+
fun createRequest(
152+
messageId: Long,
153+
userId: Long,
154+
githubName: String,
155+
repoName: String
156+
) = transaction(database) {
157+
SchemaUtils.create(Requests)
158+
159+
return@transaction Requests.insert { row ->
160+
row[Requests.messageId] = messageId
161+
row[Requests.userId] = userId
162+
row[Requests.githubName] = githubName
163+
row[Requests.repoName] = repoName
164+
}
165+
}
166+
167+
/**
168+
* Gets a [Request] by its unique ID.
169+
* @param messageId The unique ID to lookup
170+
* @return The request mapped to the unique ID, or `null` if not found
171+
*/
172+
fun getRequest(
173+
messageId: Long
174+
): Request? = transaction(database) {
175+
if (!Requests.exists()) return@transaction null
176+
177+
return@transaction Requests.selectAll().where { Requests.messageId eq messageId }
178+
.map { row -> Request(row[Requests.messageId], row[Requests.userId], row[Requests.githubName], row[Requests.repoName]) }
179+
.firstOrNull()
180+
}
181+
182+
/**
183+
* Checks if a request exists by its unique ID.
184+
* @param messageId The unique ID to lookup
185+
* @return `true` if the request exists, `false` otherwise
186+
*/
187+
fun requestExists(
188+
messageId: Long
189+
): Boolean = transaction(database) {
190+
if (!Requests.exists()) return@transaction false
191+
192+
return@transaction Requests.selectAll().where { Requests.messageId eq messageId }.count() > 0
193+
}
194+
195+
/**
196+
* Gets all requests currently linked in the database.
197+
* @return All requests in the database
198+
*/
199+
fun getAllRequests(): List<Request> = transaction(database) {
200+
if (!Requests.exists()) return@transaction emptyList()
201+
202+
return@transaction Requests.selectAll()
203+
.map { row -> Request(row[Requests.messageId], row[Requests.userId], row[Requests.githubName], row[Requests.repoName]) }
204+
}
205+
206+
/**
207+
* Removes a request from the database.
208+
* @param messageId The unique ID of the request to remove
209+
* @return `1` if removed, else `0`
210+
*/
211+
fun removeRequest(
212+
messageId: Long
213+
) = transaction(database) {
214+
if (!Requests.exists()) return@transaction 0
215+
return@transaction Requests.deleteWhere { Requests.messageId eq messageId }
216+
}
217+
218+
/**
219+
* Removes all requests from the database.
220+
* @return The count of deleted requests
221+
*/
222+
fun removeAllRequests() = transaction(database) {
223+
if (!Requests.exists()) return@transaction 0
224+
return@transaction Requests.deleteAll()
137225
}

src/main/kotlin/io/codemc/api/database/schema.kt

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,4 +30,42 @@ object Users : Table() {
3030
data class User(
3131
val username: String,
3232
val discord: Long
33+
)
34+
35+
/**
36+
* Represents the `requests` SQL table.
37+
*/
38+
object Requests : Table() {
39+
/**
40+
* The `message_id` column, representing the unique ID of the request according to Discord.
41+
*/
42+
val messageId: Column<Long> = long("message_id").uniqueIndex()
43+
/**
44+
* The `user_id` column, representing the unique ID of the Discord user.
45+
*/
46+
val userId: Column<Long> = long("user_id")
47+
/**
48+
* The `github_name` column, representing the GitHub username of the user.
49+
*/
50+
val githubName: Column<String> = varchar("github_name", 39)
51+
/**
52+
* The `repo_name` column, representing the name of the repository.
53+
*/
54+
val repoName: Column<String> = varchar("repo_name", 39)
55+
56+
override val primaryKey = PrimaryKey(messageId)
57+
}
58+
59+
/**
60+
* Represents a request in the database.
61+
* @property messageId The unique ID of the request according to Discord.
62+
* @property userId The unique ID of the Discord user.
63+
* @property githubName The GitHub username of the user.
64+
* @property repoName The name of the repository.
65+
*/
66+
data class Request(
67+
val messageId: Long,
68+
val userId: Long,
69+
val githubName: String,
70+
val repoName: String
3371
)

src/test/kotlin/io/codemc/api/database/TestDatabase.kt

Lines changed: 71 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class TestDatabase {
8888
}
8989

9090
@Test
91-
fun testAll() {
91+
fun testAllUsers() {
9292
val users = listOf(
9393
"TestUser",
9494
"TestUser2",
@@ -106,4 +106,74 @@ class TestDatabase {
106106
users.forEach { removeUser(it) }
107107
}
108108

109+
@Test
110+
fun testCreateRequest() {
111+
val messageId = 123456789L
112+
val userId = 987654321L
113+
val githubName = "MyAuthor"
114+
val repoName = "MyRepo"
115+
116+
createRequest(messageId, userId, githubName, repoName)
117+
118+
val r = getRequest(messageId)
119+
assertNotNull(r)
120+
assertEquals(userId, r?.userId)
121+
assertEquals(githubName, r?.githubName)
122+
assertEquals(repoName, r?.repoName)
123+
124+
removeRequest(messageId)
125+
}
126+
127+
@Test
128+
fun testRemoveRequest() {
129+
val messageId = 123456789L
130+
val userId = 987654321L
131+
val githubName = "MyAuthor"
132+
val repoName = "MyRepo"
133+
134+
createRequest(messageId, userId, githubName, repoName)
135+
assertNotNull(getRequest(messageId))
136+
137+
removeRequest(messageId)
138+
assertNull(getRequest(messageId))
139+
}
140+
141+
@Test
142+
fun testRemoveAllRequests() {
143+
val requests = listOf(
144+
123456789L,
145+
987654321L,
146+
123L,
147+
456L
148+
)
149+
150+
requests.forEach { createRequest(it, 0L, "Test", "Test") }
151+
requests.forEach { assertNotNull(getRequest(it)) }
152+
153+
removeAllRequests()
154+
155+
requests.forEach { assertNull(getRequest(it)) }
156+
}
157+
158+
@Test
159+
fun testMultipleRequests() {
160+
val requests = listOf(
161+
123456789L,
162+
987654321L,
163+
123L,
164+
456L
165+
)
166+
167+
requests.forEachIndexed { index, l -> createRequest(l, index.toLong(), "Test", "Test") }
168+
requests.forEachIndexed { index, l ->
169+
val r = getRequest(l)
170+
assertNotNull(r)
171+
assertEquals(index.toLong(), r?.userId)
172+
assertEquals("Test", r?.githubName)
173+
assertEquals("Test", r?.repoName)
174+
}
175+
176+
requests.forEach { removeRequest(it) }
177+
}
178+
109179
}

0 commit comments

Comments
 (0)