Skip to content

Repository files navigation

Studentify Server - Документация

Ktor + PostgreSQL

Ссылки

Технологический стек

  • Язык: Kotlin 1.9.0
  • Фреймворк: Ktor 2.3.5
  • База данных: PostgreSQL 15+
  • ORM: Exposed 0.61.0
  • Аутентификация: JWT + BCrypt
  • Логирование: Logback
  • Сериализация: kotlinx.serialization

Архитектура сервера

Сервер реализован по принципу чистой архитектуры с разделением на слои:

Android Client → Ktor Server (REST API)
├── Auth Layer (JWT)
├── Business Logic
└── PostgreSQL Database

Ключевые особенности

  1. Ролевая модель (Студенты/Преподаватели)
  2. JWT-аутентификация
  3. Реализация внутренней "валюты" (токены)
  4. CRUD операции для управления студентами
  5. Автоматическая валидация данных
  6. Поддержка WebSockets для real-time обновлений

Установка и запуск

Требования

  • Java 17+
  • PostgreSQL 15+
  • Порт 8080 открыт для входящих подключений

Настройка базы данных

  1. Создайте базу данных:
CREATEDATABASEstudentify;
  1. Создайте таблицы:
CREATETABLEstudents (
id SERIALPRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGERNOT NULLCHECK,
group_name VARCHAR(50) NOT NULL,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL,
tokens INTEGERNOT NULL
);
CREATETABLEteachers (
id SERIALPRIMARY KEY,
name VARCHAR(50) NOT NULL,
age INTEGERNOT NULLCHECK,
email VARCHAR(255) UNIQUE NOT NULL,
password VARCHAR(255) NOT NULL
);

Конфигурация сервера

Создайте файл application.yaml в директории resources:

ktor:
application:
modules: [com.studentify.ApplicationKt.module]deployment:
port: 8080host: 0.0.0.0postgres:
url: "jdbc:postgresql://localhost:5432/studentify"user: "your_username"password: "your_password"jwt:
secret: "your_strong_secret_here_at_least_32_chars"issuer: "studentify-server"audience: "studentify-app"realm: "Studentify API"

Запуск сервера

./gradlew build
java -jar build/libs/studentify-server.jar

API Endpoints

Без аутентификации

МетодEndpointОписание
GET/Статус сервера
POST/auth/registerРегистрация пользователя
POST/auth/loginАвторизация

Для студентов

МетодEndpointОписание
GET/studentsСписок всех студентов
GET/students/countКоличество студентов
GET/students/name/{name}Поиск студента по имени
GET/students/group/{group}Студенты по группе
GET/student/meДанные текущего студента

Для преподавателей

МетодEndpointОписание
GET/teacher/meДанные текущего преподавателя
POST/studentsДобавить нового студента
PUT/students/{id}Обновить данные студента
DELETE/students/{id}Удалить студента

Как обратиться к серверу с другого устройства

Шаг 1: Получите доступ к серверу

  1. Если сервер запущен локально:

    • Узнайте ваш публичный IP: whatismyip.com
    • Настройте проброс портов на роутере:
      • Внешний порт: 8080
      • Внутренний IP: [IP вашего компьютера]
      • Внутренний порт: 8080
    • Или используйте ngrok для временного туннеля:
      ngrok http 8080
    • При разработке использовался BaseUrl адрес (и автор (я) может его открыть для теста)
       https://modern-marmot-eminently.ngrok-free.app/
  2. Если сервер на VPS:

    • Убедитесь, что порт 8080 открыт в брандмауэре:
      sudo ufw allow 8080/tcp

Шаг 2: Тестирование с помощью cURL

  1. Регистрация студента:
curl -X POST http://<SERVER_IP>:8080/auth/register \
-H "Content-Type: application/json" \
-d '{ "name": "Иван Иванов", "age": 20, "email": "ivanov@edu.ru", "password": "securePass123", "role": "STUDENT", "group": "CS-101" }'
  1. Авторизация:
curl -X POST http://<SERVER_IP>:8080/auth/login \
-H "Content-Type: application/json" \
-d '{"email": "ivanov@edu.ru", "password": "securePass123"}'
  1. Доступ к защищённому ресурсу (используйте токен из предыдущего ответа):
curl http://<SERVER_IP>:8080/student/me \
-H "Authorization: Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9..."

Примеры запросов и ответов

Успешная авторизация (200 OK)

{
"token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...",
"userId": 1,
"role": "STUDENT"
}

Получение данных студента (200 OK)

{
"id": 1,
"name": "Иван Иванов",
"age": 20,
"group": "CS-101",
"email": "ivanov@edu.ru",
"password": "hashed_password",
"tokens": 150
}

Ошибка доступа (403 Forbidden)

{
"error": "Only teachers can perform this action"
}

Безопасность

  1. Все пароли хранятся в виде BCrypt-хешей
  2. Используются JWT-токены с 7-дневным сроком действия
  3. Автоматическая валидация входных данных
  4. Разделение прав доступа по ролям

About

Ktor-server for Studentify Android App

Topics

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages