Refactor: extract helpers to satisfy detekt (throws, returns, loops)

This commit is contained in:
2026-09-27 22:00:15 +03:00
parent a821d97ef7
commit 577a2c8f41
7 changed files with 168 additions and 92 deletions

View File

@@ -89,12 +89,13 @@ class GroupService(
groups.findById(groupId).orElseThrow { NotFoundException("Группа не найдена") }
val memberIds = enrollments.findAllByGroupId(groupId).mapNotNull { it.student?.accountId }.toSet()
val currentByStudent = HashMap<UUID, Pair<UUID, String>>()
for (e in enrollments.findAll()) {
val sid = e.student?.accountId ?: continue
val gid = e.group?.id ?: continue
val name = e.group?.name ?: continue
currentByStudent[sid] = gid to name
}
enrollments
.findAll()
.mapNotNull { enrollment ->
val sid = enrollment.student?.accountId ?: return@mapNotNull null
val group = enrollment.group ?: return@mapNotNull null
sid to (group.id to group.name)
}.forEach { (sid, group) -> currentByStudent[sid] = group }
return students
.findAll()
.filter { it.accountId !in memberIds }

View File

@@ -92,40 +92,52 @@ class StudentImportParser {
filename: String,
rows: List<List<String>>,
): ParsedGroup {
val headerIndex = rows.indexOfFirst { row -> row.any { isStudentHeader(it) } }
if (headerIndex < 0) {
throw BadRequestException("Не найден столбец «Студенческий номер». Проверьте шапку таблицы.")
}
val columns = mapColumns(rows[headerIndex])
if (columns["studentNo"] == null) {
throw BadRequestException("Не найден столбец «Студенческий номер»")
}
val students =
rows.drop(headerIndex + 1).mapNotNull { row ->
fun cell(key: String): String = columns[key]?.let { row.getOrNull(it) }.orEmpty().trim()
val studentNo = normalizeNumber(cell("studentNo"))
val lastName = cell("lastName")
if (studentNo.isBlank() && lastName.isBlank()) {
return@mapNotNull null
}
if (studentNo.isBlank()) {
throw BadRequestException("В одной из строк отсутствует студенческий номер")
}
ParsedStudent(
studentNo = studentNo,
lastName = lastName,
firstName = cell("firstName"),
middleName = cell("middleName"),
basis = cell("basis"),
note = cell("note"),
)
}
val headerIndex = requireHeader(rows)
val columns = requireColumns(rows[headerIndex])
val students = rows.drop(headerIndex + 1).mapNotNull { parseStudent(it, columns) }
if (students.isEmpty()) {
throw BadRequestException("В таблице не найдено ни одного студента")
}
return ParsedGroup(groupNameFrom(filename, rows), students)
}
private fun requireHeader(rows: List<List<String>>): Int {
val headerIndex = rows.indexOfFirst { row -> row.any { isStudentHeader(it) } }
if (headerIndex < 0) {
throw BadRequestException("Не найден столбец «Студенческий номер». Проверьте шапку таблицы.")
}
return headerIndex
}
private fun requireColumns(header: List<String>): Map<String, Int> {
val columns = mapColumns(header)
if (columns["studentNo"] == null) {
throw BadRequestException("Не найден столбец «Студенческий номер»")
}
return columns
}
private fun parseStudent(
row: List<String>,
columns: Map<String, Int>,
): ParsedStudent? {
fun cell(key: String): String = columns[key]?.let { row.getOrNull(it) }.orEmpty().trim()
val studentNo = normalizeNumber(cell("studentNo"))
val lastName = cell("lastName")
if (studentNo.isBlank() && lastName.isBlank()) return null
if (studentNo.isBlank()) {
throw BadRequestException("В одной из строк отсутствует студенческий номер")
}
return ParsedStudent(
studentNo = studentNo,
lastName = lastName,
firstName = cell("firstName"),
middleName = cell("middleName"),
basis = cell("basis"),
note = cell("note"),
)
}
private fun isStudentHeader(value: String): Boolean {
val normalized = value.lowercase().replace("\u00a0", " ").trim()
return normalized.startsWith("студен") ||