Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
28 commits
Select commit Hold shift + click to select a range
7f30292
feat(storage): add postgres connection
rLukoyanov Mar 18, 2025
47f90f6
feat(storage): remove pq, add pgx, add config
rLukoyanov Mar 18, 2025
c425ec8
feat(storage): add err handler
rLukoyanov Mar 18, 2025
e6b3648
feat(storage): refactoring
rLukoyanov Mar 18, 2025
6a61901
feat(storage): init echo, init migrations
rLukoyanov Mar 19, 2025
be05592
feat(storage): init logger
rLukoyanov Mar 19, 2025
4870f89
feat(storage): add handlers
rLukoyanov Mar 19, 2025
bda5821
feat(storage): add models & repos
rLukoyanov Mar 19, 2025
586c90d
feat(storage): add services
rLukoyanov Mar 19, 2025
b9d13a1
feat(storage): add equipment getAll handler
rLukoyanov Mar 20, 2025
10754cd
feat(storage): add equipment get by id handler
rLukoyanov Mar 20, 2025
b192821
feat(equipment): add update,create,delete methods
rLukoyanov Mar 20, 2025
d1e98e0
feat(equipment): add router folder
rLukoyanov Mar 20, 2025
04518dd
add workflow
rLukoyanov Mar 20, 2025
dcce2cb
fix workflow
rLukoyanov Mar 20, 2025
63ec4a3
Merge branch 'main' into feat/storage
rLukoyanov Mar 20, 2025
e7d58d5
fix workflow
rLukoyanov Mar 21, 2025
84beec5
fix workflow
rLukoyanov Mar 21, 2025
09d8369
fix workflow
rLukoyanov Mar 21, 2025
b914d9f
fix workflow
rLukoyanov Mar 21, 2025
81c3e33
Update deploy.yml
rLukoyanov Mar 21, 2025
bda7283
feat(equipment): add unic checks and transaktions
rLukoyanov Mar 23, 2025
a950af7
Merge branch 'feat/storage' of https://github.com/Project263/base int…
rLukoyanov Mar 23, 2025
661ee8c
feat(equipment): add gracful shitdown
rLukoyanov Mar 23, 2025
0334580
add dokerfile
rLukoyanov Mar 23, 2025
2b4fba1
feat(muscles): add muscles
rLukoyanov Mar 23, 2025
c953951
feat(trains) add trains
rLukoyanov Mar 23, 2025
3aa8268
feat(trains) add get by id
rLukoyanov Mar 23, 2025
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
5 changes: 5 additions & 0 deletions .env.example
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
HOST="localhost"
PORT=5432

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

хлопни

POSTGRES_USERNAME="root"
POSTGRES_PASSWORD="123"
DBNAME="base"
11 changes: 11 additions & 0 deletions cmd/base/main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,11 @@
package main

import "theAesthetics.ru/base/internal/storage"

func main() {
// init logger
// init db
DB := storage.InitPostgres()
_ = DB
// run http server
}
270 changes: 270 additions & 0 deletions internal/storage/initTables.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,270 @@
package storage

import (
"database/sql"
"fmt"
"log"
)

// Выполнение SQL-запроса с проверкой ошибки
func execQuery(db *sql.DB, query string) error {
_, err := db.Exec(query)
if err != nil {
return fmt.Errorf("ошибка выполнения запроса: %w", err)
}
return nil
}

func InitTables(db *sql.DB) {
// Создание всех таблиц
if err := createUsersTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы users: %v", err)
}
if err := createAchievementsTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы achievements: %v", err)
}
if err := createUsersAchievementsTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы users_achievements: %v", err)
}
if err := createMusclesTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы muscles: %v", err)
}
if err := createExercisesTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы exercises: %v", err)
}
if err := createEquipmentsTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы equipments: %v", err)
}
if err := createTrainsTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы trains: %v", err)
}
if err := createTrainsExercisesTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы trains_exercises: %v", err)
}
if err := createExercisesHelpMuscleTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы exercises_help_muscle: %v", err)
}
if err := createTrainHelpMuscleTable(db); err != nil {
log.Fatalf("Ошибка создания таблицы train_help_muscle: %v", err)
}

// Создание всех связей между таблицами
if err := createExercisesRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы exercises: %v", err)
}
if err := createTrainsExercisesRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы trains_exercises: %v", err)
}
if err := createUsersAchievementsRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы users_achievements: %v", err)
}
if err := createTrainsRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы trains: %v", err)
}
if err := createExercisesHelpMuscleRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы exercises_help_muscle: %v", err)
}
if err := createTrainHelpMuscleRelations(db); err != nil {
log.Fatalf("Ошибка создания связей для таблицы train_help_muscle: %v", err)
}

fmt.Println("Все таблицы и связи успешно созданы!")
}

// Таблица пользователей
func createUsersTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS users (
id SERIAL PRIMARY KEY,
login VARCHAR UNIQUE NOT NULL,
password VARCHAR NOT NULL,
nickname VARCHAR NOT NULL,
avatar VARCHAR,
advanced_version BOOLEAN DEFAULT false,
phone VARCHAR UNIQUE,
is_verified_phone BOOLEAN DEFAULT false,
email VARCHAR UNIQUE NOT NULL,
is_verified_mail BOOLEAN DEFAULT false,
age INT,
height INT,
weight INT,
sex VARCHAR,
day_streak INT DEFAULT 0,
is_train_today BOOLEAN DEFAULT false,
points INT DEFAULT 0,
created_at BIGINT,
update_at BIGINT
);`
return execQuery(db, query)
}

// Таблица достижений
func createAchievementsTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS achievements (
id SERIAL PRIMARY KEY,
title VARCHAR UNIQUE NOT NULL,
description VARCHAR UNIQUE NOT NULL,
image VARCHAR NOT NULL
);`
return execQuery(db, query)
}

// Таблица достижений пользователей
func createUsersAchievementsTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS users_achievements (
id SERIAL PRIMARY KEY,
user_id INT REFERENCES users(id),
achievement_id INT REFERENCES achievements(id)
);`
return execQuery(db, query)
}

// Таблица мышц
func createMusclesTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS muscles (
id SERIAL PRIMARY KEY,
title VARCHAR UNIQUE NOT NULL,
image VARCHAR UNIQUE NOT NULL
);`
return execQuery(db, query)
}

// Таблица упражнений
func createExercisesTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS exercises (
id SERIAL PRIMARY KEY,
title VARCHAR UNIQUE NOT NULL,
description VARCHAR UNIQUE NOT NULL,
image VARCHAR,
video_url VARCHAR,
equipment_id INT NOT NULL,
sets INT NOT NULL,
reps INT NOT NULL,
difficult INT NOT NULL,
lead_muscle_id INT NOT NULL
);`
return execQuery(db, query)
}

// Таблица оборудования
func createEquipmentsTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS equipments (
id SERIAL PRIMARY KEY,
title VARCHAR UNIQUE NOT NULL,
image VARCHAR UNIQUE NOT NULL
);`
return execQuery(db, query)
}

// Таблица тренировок
func createTrainsTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS trains (
id SERIAL PRIMARY KEY,
title VARCHAR UNIQUE NOT NULL,
description VARCHAR NOT NULL,
image VARCHAR,
video_url VARCHAR,
difficult INT,
duration_train INT,
lead_muscle_id INT NOT NULL
);`
return execQuery(db, query)
}

// Таблица упражнений в тренировках
func createTrainsExercisesTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS trains_exercises (
id SERIAL PRIMARY KEY,
train_id INT REFERENCES trains(id),
exercise_id INT REFERENCES exercises(id)
);`
return execQuery(db, query)
}

// Таблица вспомогательных мышц упражнений
func createExercisesHelpMuscleTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS exercises_help_muscle (
id SERIAL PRIMARY KEY,
exercise_id INT REFERENCES exercises(id),
help_muscle_id INT REFERENCES muscles(id)
);`
return execQuery(db, query)
}

// Таблица вспомогательных мышц тренировок
func createTrainHelpMuscleTable(db *sql.DB) error {
query := `
CREATE TABLE IF NOT EXISTS train_help_muscle (
id SERIAL PRIMARY KEY,
train_id INT REFERENCES trains(id),
help_muscle_id INT REFERENCES muscles(id)
);`
return execQuery(db, query)
}

// Создание связей для таблицы exercises
func createExercisesRelations(db *sql.DB) error {
query := `
ALTER TABLE exercises
ADD FOREIGN KEY (lead_muscle_id) REFERENCES muscles(id),
ADD FOREIGN KEY (equipment_id) REFERENCES equipments(id);
`
return execQuery(db, query)
}

// Создание связей для таблицы trains_exercises
func createTrainsExercisesRelations(db *sql.DB) error {
query := `
ALTER TABLE trains_exercises
ADD FOREIGN KEY (train_id) REFERENCES trains(id),
ADD FOREIGN KEY (exercise_id) REFERENCES exercises(id);
`
return execQuery(db, query)
}

// Создание связей для таблицы users_achievements
func createUsersAchievementsRelations(db *sql.DB) error {
query := `
ALTER TABLE users_achievements
ADD FOREIGN KEY (user_id) REFERENCES users(id),
ADD FOREIGN KEY (achievement_id) REFERENCES achievements(id);
`
return execQuery(db, query)
}

// Создание связей для таблицы trains
func createTrainsRelations(db *sql.DB) error {
query := `
ALTER TABLE trains
ADD FOREIGN KEY (lead_muscle_id) REFERENCES muscles(id);
`
return execQuery(db, query)
}

// Создание связей для таблицы exercises_help_muscle
func createExercisesHelpMuscleRelations(db *sql.DB) error {
query := `
ALTER TABLE exercises_help_muscle
ADD FOREIGN KEY (exercise_id) REFERENCES exercises(id),
ADD FOREIGN KEY (help_muscle_id) REFERENCES muscles(id);
`
return execQuery(db, query)
}

// Создание связей для таблицы train_help_muscle
func createTrainHelpMuscleRelations(db *sql.DB) error {
query := `
ALTER TABLE train_help_muscle
ADD FOREIGN KEY (train_id) REFERENCES trains(id),
ADD FOREIGN KEY (help_muscle_id) REFERENCES muscles(id);
`
return execQuery(db, query)
}
38 changes: 38 additions & 0 deletions internal/storage/storage.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package storage

import (
"database/sql"
"fmt"
"os"

"github.com/joho/godotenv"
_ "github.com/lib/pq"
)

func InitPostgres() *sql.DB {
err := godotenv.Load()

if err != nil {
fmt.Println("Ошибка загрузки .env")

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

на работе в рот накажут

}

host := os.Getenv("HOST")
port := os.Getenv("PORT")
username := os.Getenv("POSTGRES_USERNAME")
password := os.Getenv("POSTGRES_PASSWORD")
databaseName := os.Getenv("DBNAME")

psqlInfo := fmt.Sprintf("host=%s port=%s user=%s "+
"password=%s dbname=%s sslmode=disable",
host, port, username, password, databaseName)

DB, err := sql.Open("postgres", psqlInfo)
if err != nil {
fmt.Println(err.Error())
panic("База данных нихуя не работает")
}

InitTables(DB)

return DB
}

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Добавить помимо функции инициализации структуру, чтобы все конфиги были в одном месте, желательно отдельную папку config/config.go