319 lines
6.1 KiB
Markdown
319 lines
6.1 KiB
Markdown
# API Документация — Apple Style App
|
||
|
||
## 📚 Обзор
|
||
|
||
Бэкенд построен на **Node.js http** (без зависимостей). Данные хранятся в `data.json`.
|
||
|
||
---
|
||
|
||
## 🔌 PUBLIC API (без авторизации)
|
||
|
||
### Получить все продукты
|
||
```
|
||
GET /api/products
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"data": [
|
||
{
|
||
"id": 1,
|
||
"name": "Vision Pro",
|
||
"tagline": "Пространственный компьютер здесь",
|
||
"description": "...",
|
||
"price": 3499,
|
||
"image": "https://...",
|
||
"features": ["M2", "R1"],
|
||
"category": "premium",
|
||
"order": 1
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Получить продукт по ID
|
||
```
|
||
GET /api/products/:id
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"data": { /* объект продукта */ }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Получить активные объявления
|
||
```
|
||
GET /api/announcements
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"data": [
|
||
{
|
||
"id": 1,
|
||
"title": "Apple Event 2026",
|
||
"date": "2026-09-15",
|
||
"content": "Смотрите презентацию...",
|
||
"active": true
|
||
}
|
||
]
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Получить настройки сайта
|
||
```
|
||
GET /api/settings
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"data": {
|
||
"heroTitle": "Добро пожаловать в будущее",
|
||
"heroSubtitle": "Инновации, которые меняют мир",
|
||
"theme": "dark"
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔐 ADMIN API (для редактирования)
|
||
|
||
### Добавить продукт
|
||
```
|
||
POST /api/admin/products
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"name": "iPhone 18 Pro",
|
||
"tagline": "Ещё мощнее",
|
||
"description": "Описание...",
|
||
"price": 999,
|
||
"category": "phones",
|
||
"image": "https://...",
|
||
"features": ["A18 чип", "Face ID", "5G"]
|
||
}
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"data": { /* созданный продукт с id и order */ }
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Обновить продукт
|
||
```
|
||
PUT /api/admin/products/:id
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"name": "Новое название",
|
||
"price": 1099
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Удалить продукт
|
||
```
|
||
DELETE /api/admin/products/:id
|
||
```
|
||
|
||
**Ответ:**
|
||
```json
|
||
{
|
||
"ok": true,
|
||
"deleted": 123
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Добавить объявление
|
||
```
|
||
POST /api/admin/announcements
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"title": "Специальное предложение",
|
||
"date": "2026-12-01",
|
||
"content": "Скидки до 30%",
|
||
"active": true
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Обновить объявление
|
||
```
|
||
PUT /api/admin/announcements/:id
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"title": "Обновлённый заголовок",
|
||
"active": false
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
### Удалить объявление
|
||
```
|
||
DELETE /api/admin/announcements/:id
|
||
```
|
||
|
||
---
|
||
|
||
### Обновить настройки сайта
|
||
```
|
||
PUT /api/admin/settings
|
||
Content-Type: application/json
|
||
|
||
{
|
||
"heroTitle": "Новый заголовок",
|
||
"heroSubtitle": "Новый подзаголовок",
|
||
"theme": "light"
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🗂 Структура данных (data.json)
|
||
|
||
```json
|
||
{
|
||
"products": [
|
||
{
|
||
"id": number,
|
||
"name": string,
|
||
"tagline": string,
|
||
"description": string,
|
||
"price": number,
|
||
"image": string (URL),
|
||
"features": string[],
|
||
"category": string,
|
||
"order": number
|
||
}
|
||
],
|
||
"announcements": [
|
||
{
|
||
"id": number,
|
||
"title": string,
|
||
"date": string (ISO date),
|
||
"content": string,
|
||
"active": boolean
|
||
}
|
||
],
|
||
"siteSettings": {
|
||
"heroTitle": string,
|
||
"heroSubtitle": string,
|
||
"theme": string ("dark" | "light")
|
||
}
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🚀 Архитектура сервера
|
||
|
||
```
|
||
server.js
|
||
├── Routes (API)
|
||
│ ├── GET /api/products → список продуктов
|
||
│ ├── GET /api/products/:id → продукт по ID
|
||
│ ├── GET /api/announcements → активные объявления
|
||
│ ├── GET /api/settings → настройки сайта
|
||
│ │
|
||
│ └── ADMIN (CRUD)
|
||
│ ├── POST /api/admin/products
|
||
│ ├── PUT /api/admin/products/:id
|
||
│ ├── DELETE /api/admin/products/:id
|
||
│ ├── POST /api/admin/announcements
|
||
│ ├── PUT /api/admin/announcements/:id
|
||
│ ├── DELETE /api/admin/announcements/:id
|
||
│ └── PUT /api/admin/settings
|
||
│
|
||
└── Static Files
|
||
├── / → index.html
|
||
├── /admin.html
|
||
├── /style.css
|
||
├── /app.js
|
||
└── /admin.js
|
||
```
|
||
|
||
---
|
||
|
||
## 📝 Примеры использования (Frontend)
|
||
|
||
### Загрузка продуктов
|
||
```javascript
|
||
async function loadProducts() {
|
||
const res = await fetch('/api/products');
|
||
const json = await res.json();
|
||
if (json.ok) {
|
||
console.log(json.data); // массив продуктов
|
||
}
|
||
}
|
||
```
|
||
|
||
### Добавление продукта (из админки)
|
||
```javascript
|
||
async function addProduct(data) {
|
||
const res = await fetch('/api/admin/products', {
|
||
method: 'POST',
|
||
headers: { 'Content-Type': 'application/json' },
|
||
body: JSON.stringify(data)
|
||
});
|
||
const json = await res.json();
|
||
return json.ok;
|
||
}
|
||
```
|
||
|
||
---
|
||
|
||
## 🔒 Безопасность (TODO для продакшена)
|
||
|
||
Сейчас API открыт. Для продакшена добавить:
|
||
- JWT или session аутентификацию для `/api/admin/*`
|
||
- Валидацию входных данных
|
||
- Rate limiting
|
||
- CORS только для доверенных доменов
|
||
|
||
---
|
||
|
||
## 🧪 Тестирование
|
||
|
||
```bash
|
||
# Получить все продукты
|
||
curl http://localhost:3000/api/products
|
||
|
||
# Добавить продукт
|
||
curl -X POST http://localhost:3000/api/admin/products \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"name":"Test","tagline":"Test","price":99,"category":"test","features":[]}'
|
||
|
||
# Обновить настройки
|
||
curl -X PUT http://localhost:3000/api/admin/settings \
|
||
-H "Content-Type: application/json" \
|
||
-d '{"heroTitle":"Hello"}'
|
||
```
|