- FastAPI backend with SQLite database - JWT authentication (register, login) - User profiles with follow/unfollow - Posts with image upload and likes/dislikes - Comments with likes - Global and personalized feed - Comprehensive pytest test suite (37 tests) TASK-ID: 758f4029-702
152 lines
3.0 KiB
Markdown
152 lines
3.0 KiB
Markdown
# SocialPhoto - Instagram Clone
|
|
|
|
A simple Instagram clone API built with FastAPI and SQLite.
|
|
|
|
## Quick Start
|
|
|
|
### 1. Install dependencies
|
|
|
|
```bash
|
|
pip install -r requirements.txt
|
|
```
|
|
|
|
### 2. Run the server
|
|
|
|
```bash
|
|
cd app
|
|
uvicorn main:app --reload --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
Or from the root directory:
|
|
|
|
```bash
|
|
uvicorn app.main:app --reload --host 0.0.0.0 --port 8000
|
|
```
|
|
|
|
### 3. Access API docs
|
|
|
|
Open your browser to: http://localhost:8000/docs
|
|
|
|
## API Endpoints
|
|
|
|
### Authentication
|
|
|
|
```bash
|
|
# Register
|
|
curl -X POST http://localhost:8000/auth/register \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username":"test","email":"test@test.com","password":"password123"}'
|
|
|
|
# Login
|
|
curl -X POST http://localhost:8000/auth/login \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"username":"test","password":"password123"}'
|
|
```
|
|
|
|
### Posts
|
|
|
|
```bash
|
|
# Create post (requires auth token)
|
|
curl -X POST http://localhost:8000/posts \
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
-F "caption=My first post" \
|
|
-F "image=@photo.jpg"
|
|
|
|
# Get all posts
|
|
curl http://localhost:8000/posts
|
|
|
|
# Get single post
|
|
curl http://localhost:8000/posts/1
|
|
|
|
# Like a post
|
|
curl -X POST http://localhost:8000/posts/1/like \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
|
|
# Delete post (owner only)
|
|
curl -X DELETE http://localhost:8000/posts/1 \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
```
|
|
|
|
### Users
|
|
|
|
```bash
|
|
# Get user profile
|
|
curl http://localhost:8000/users/1
|
|
|
|
# Get user posts
|
|
curl http://localhost:8000/users/1/posts
|
|
|
|
# Get user stats
|
|
curl http://localhost:8000/users/1/stats
|
|
|
|
# Follow user
|
|
curl -X POST http://localhost:8000/users/1/follow \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
|
|
# Unfollow user
|
|
curl -X DELETE http://localhost:8000/users/1/follow \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
```
|
|
|
|
### Comments
|
|
|
|
```bash
|
|
# Add comment
|
|
curl -X POST http://localhost:8000/posts/1/comments \
|
|
-H "Authorization: Bearer YOUR_TOKEN" \
|
|
-H "Content-Type: application/json" \
|
|
-d '{"content":"Great post!"}'
|
|
|
|
# Get comments
|
|
curl http://localhost:8000/posts/1/comments
|
|
|
|
# Delete comment (owner only)
|
|
curl -X DELETE http://localhost:8000/comments/1 \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
```
|
|
|
|
### Feed
|
|
|
|
```bash
|
|
# Get followed users feed (requires auth)
|
|
curl http://localhost:8000/feed \
|
|
-H "Authorization: Bearer YOUR_TOKEN"
|
|
|
|
# Get global feed
|
|
curl http://localhost:8000/feed/global
|
|
```
|
|
|
|
## Running Tests
|
|
|
|
```bash
|
|
pytest tests/ -v
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
app/
|
|
├── main.py # FastAPI application
|
|
├── database.py # SQLite database setup
|
|
├── models.py # Pydantic models
|
|
├── auth.py # JWT authentication
|
|
└── routes/
|
|
├── auth.py # Auth endpoints
|
|
├── users.py # User endpoints
|
|
├── posts.py # Post endpoints
|
|
├── comments.py # Comment endpoints
|
|
└── feed.py # Feed endpoints
|
|
```
|
|
|
|
## Tech Stack
|
|
|
|
- **Framework**: FastAPI 0.109+
|
|
- **Database**: SQLite
|
|
- **Auth**: JWT (python-jose)
|
|
- **Password Hashing**: bcrypt
|
|
- **Testing**: pytest
|
|
|
|
## License
|
|
|
|
MIT
|