3.8 KiB
Proje Yapısı
goaresv3/
├── main.go
├── .env
├── app/
│ ├── accounts/
│ │ ├── handlers/user.go
│ │ └── models/accounts.go
│ ├── settings/
│ │ ├── handlers/settings.go
│ │ └── models/{setting,hero,cors}.go
│ ├── shop/
│ │ ├── handlers/shop.go
│ │ └── models/{product,cart}.go
│ └── blog/
│ ├── handlers/blog.go
│ └── models/blog.go
├-------── config/
| ├── db.go
│ └── redis.go
├── pkg/
│ ├── jwt/jwt.go
│ ├── mailer/mailer.go
│ ├── middleware/{auth,cors_dynamic,rate_limit_dynamic}.go
│ └── swaggerui/initializer.go
├── router/router.go
├── docs/{docs.go,swagger.json,swagger.yaml}
└── belgeler/
Uygulama Akışı
.envyüklenir (godotenv).config.ConnectDB()ile MySQL bağlantısı açılır.config.RunAutoMigrate()tüm modüllerin şemalarını uygular.config.SeedSecurityDefaults()CORS/RateLimit başlangıç kayıtlarını (yoksa) ekler.- Gin başlatılır, global middlewareler çalışır:
DynamicCORS()DynamicRateLimit()
router.Setup(r)ile endpointler yüklenir.
Yetki Modeli
AuthRequired():- Sadece standart JWT (
HS256) access token doğrular iss,aud,nbfclaim kontrolleri zorunludur- Context'e
user_id,email,usernameyazar
- Sadece standart JWT (
AdminRequired():users.is_adminalanını kontrol ederPOST/PUT/DELETE/PATCHgibi mutating endpointlerde kullanılır
Route Grupları
- Public:
/api/v1/auth/* - Auth zorunlu (read + user işlemleri):
/api/v1/* - Admin zorunlu (mutating yönetim işlemleri):
/api/v1/*altında admin grubu - Swagger UI:
/swagger/*any
Swagger Uretimi
- Swagger dokumanini olustur/guncelle:
swag init -g main.go -o docs
- Uygulamayi calistir ve Swagger UI ac:
http://localhost:8080/swagger/index.html
Not:
- Legacy access token formatlari desteklenmez.
JWT_SECRETbos ise uygulama fail-fast ile acilmaz.Authorizationheader formati zorunludur:Bearer <access_token>.
{ "access": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwidXNlcl9pZCI6IjEiLCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwidXNlcm5hbWUiOiJiZXloYW5vIiwiZXhwIjoxNzc2MjkxNjQzLCJpYXQiOjE3NzYyOTA3NDMsImp0aSI6Ijg1NzkzZWE5ODQ5NjI4MzE0MjNlMWIyZWJmNDU1YjA0In0.2trNlY6FxrNAIEyIu_VZEEwDdKAm9OMQYm8ab2Npiz0", "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInVzZXJfaWQiOiIxIiwiZXhwIjoxNzc2ODk1NTQzLCJpYXQiOjE3NzYyOTA3NDMsImp0aSI6ImNiMTM4MWZjNTgwMjRjMzJiMDFlMDMwNjU4MjlkNDQzIn0.zpIaABAy0vZJa94_OTZNj4Mn1YISZonDgztrAoqiQg4" }
{ "access": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwidXNlcl9pZCI6IjEiLCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwidXNlcm5hbWUiOiJiZXloYW5vIiwiZXhwIjoxNzc2MjkyMjc0LCJpYXQiOjE3NzYyOTEzNzQsImp0aSI6ImJlNTQxMGNkYzljYjRkODBmM2EyYzgwNDJkMWE4MzFmIn0.sNbrxgNkLzama5m52zIunQOOu2K4a08xZz9CUwdRNg4", "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInVzZXJfaWQiOiIxIiwiZXhwIjoxNzc2ODk2MTc0LCJpYXQiOjE3NzYyOTEzNzQsImp0aSI6IjI3NTlhMGI1YzFjZjFhYjBlN2EyMWVlZjE3NmM4YzdjIn0.5YdO_jVJzIzJHWGf52o46RZqgcC-DmVQv1BUx1lPUMc" }
{ "access": "Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoiYWNjZXNzIiwidXNlcl9pZCI6IjEiLCJlbWFpbCI6ImJleWhhbkBiZXloYW4uZGV2IiwidXNlcm5hbWUiOiJCZXloYW4gT8SfdXIiLCJleHAiOjE3NzYyOTgwNzAsImlhdCI6MTc3NjI5NzE3MCwianRpIjoiZGUyZWNiZGY5ZjU4MGJhOTA4ODI1MGUyMWE0MTNjYTcifQ.NiT5spcCm9sd7S9DttuFHA__KzFq3pQIJ8xkJKtntnc", "refresh": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ0b2tlbl90eXBlIjoicmVmcmVzaCIsInVzZXJfaWQiOiIxIiwiZXhwIjoxNzc2OTAxOTcwLCJpYXQiOjE3NzYyOTcxNzAsImp0aSI6ImQ5MTgyZGUyNTE4ZjkwMmUwMGQwMjA2MWZmMTZhYjg5In0.lW7CNuSqEq1aY7XIWVm6v9diGOWmlm_BqIMnM9CtZ8Y" }