Refactor: extract helpers to satisfy detekt (throws, returns, loops)
This commit is contained in:
@@ -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 }
|
||||
|
||||
@@ -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("студен") ||
|
||||
|
||||
Reference in New Issue
Block a user