Skip to content

UBAH777/Reddit-clone

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

1 Commit
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

Reddit Clone

A Reddit-like REST API backend written in Go. Supports posts, comments, voting, and JWT-based authentication.


Tech Stack

Layer Technology
Language Go 1.25
HTTP net/http (stdlib)
Auth JWT (golang-jwt/jwt/v5)
Database PostgreSQL 16
Sessions Redis 7
Config cleanenv + .env
Containerization Docker + Docker Compose

Architecture

┌─────────────────────────────────────────────────────┐
│                    Client (SPA)                     │
└─────────────────────────┬───────────────────────────┘
                          │ REST API
┌─────────────────────────▼───────────────────────────┐
│                  HTTP Server (Go)                   │
│                                                     │
│  ┌─────────────┐    ┌──────────────────────────┐    │
│  │  Middleware │    │         Handlers         │    │
│  │             │    │                          │    │
│  │ • LoggerMW  │───▶│  UserHandler             │    │
│  │ • AuthMW    │    │  • Register              │    │
│  └─────────────┘    │  • Login                 │    │
│                     │                          │    │
│                     │  PostHandler             │    │
│                     │  • List / GetByID        │    │
│                     │  • Add / Delete          │    │
│                     │  • AddComment            │    │
│                     │  • DeleteComment         │    │
│                     │  • Upvote/Downvote/Unvote│    │
│                     └──────────┬───────────────┘    │
└────────────────────────────────┼────────────────────┘
                                 │
              ┌──────────────────┼──────────────────┐
              │                  │                  │
┌─────────────▼──────┐  ┌────────▼───────┐  ┌───────▼───────┐
│  session.MemoryRepo│  │UserStorageMngr │  │PostStorageMngr│
│                    │  │                │  │               │
│  Register          │  │  CreateUser    │  │  GetAll       │
│  Authorize         │  │  AuthUser      │  │  GetByID      │
└─────────────┬──────┘  └───────┬────────┘  └──────┬────────┘
              │                 │                  │
┌─────────────▼──────┐  ┌───────▼──────────────────▼────────┐
│    Redis           │  │           PostgreSQL              │
│                    │  │                                   │
│  sessions:{user}   │  │  users  posts  comments  votes    │
└────────────────────┘  └───────────────────────────────────┘

Project

redditclone/
├── cmd/
│   └── redditclone/
│       └── main.go
├── internal/
│   ├── config/
│   ├── handler/
│   ├── logger/
│   ├── middleware/
│   ├── post/
│   ├── session/
│   └── user/
├── Volume/
│   └── sample_db.sql
├── static/
├── env/
│   ├── .env.example
│   └── .env
├── Dockerfile
└── docker-compose.yml

API

Public endpoints

Method Path Description
POST /api/register Регистрация
POST /api/login Вход, получение JWT
GET /api/posts Все посты
GET /api/posts/{category} Посты по категории
GET /api/post/{id} Пост по ID
GET /api/user/{login} Посты пользователя

Authenticated endpoints (Bearer JWT)

Method Path Description
POST /api/posts Создать пост
DELETE /api/post/{id} Удалить пост
POST /api/post/{id} Добавить комментарий
DELETE /api/post/{postId}/{commentId} Удалить комментарий
GET /api/post/{id}/upvote Проголосовать за
GET /api/post/{id}/downvote Проголосовать против
GET /api/post/{id}/unvote Убрать голос

Getting Started

Prerequisites

Запуск через Docker Compose (рекомендуется)

# 1. Клонировать репозиторий
git clone https://github.com/your-username/redditclone.git
cd redditclone

# 2. Создать файл конфигурации
cp env/.env.example env/.env
# При необходимости отредактировать env/.env

# 3. Запустить все сервисы
docker compose up --build

# Приложение доступно на http://localhost:8080
# Остановить и удалить контейнеры
docker compose down

# Остановить и удалить контейнеры вместе с данными
docker compose down -v

Configuration

Все параметры задаются через переменные окружения (или файл env/.env).

Переменная По умолчанию Описание
HTTP_SERVER_ADDRESS :8080 Адрес и порт сервера
HTTP_SERVER_READ_TIMEOUT 10s Таймаут чтения запроса
HTTP_SERVER_WRITE_TIMEOUT 10s Таймаут записи ответа
JWT_SECRET change-me-in-production Секрет для подписи JWT
SESSION_STORAGE_ADDRESS localhost Адрес Redis
SESSION_STORAGE_PORT 6379 Порт Redis
USER_STORAGE_ADDRESS localhost Адрес PostgreSQL
USER_STORAGE_PORT 5432 Порт PostgreSQL
USER_STORAGE_USERNAME Пользователь БД
USER_STORAGE_PASSWORD Пароль БД
USER_STORAGE_DB_NAME Имя базы данных

Обязательно смените JWT_SECRET


Logs

Приложение пишет структурированные JSON-логи в несколько файлов:

logs/
├── sql.json      # работа с хранилищем
├── redis.json    # работа с сессиями
└── http.json     # HTTP-запросы

License

MIT

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors