A social network API with the functionalities (so far) of user registration, following users, search, posting, and liking posts.
- PostgreSQL 16.0
- Golang 1.21.1
If you use docker, here you will find a complete environment container.
Clone or download this repository.
Copy .env.example
to .env
.
Important
You must set SECRET_KEY
in this file, which can literally be any string.
However, you can generate a SECRET_KEY
with the following Go code, which will print it in the prompt. After that, simply copy the generated hash to the .env
file.
package main
import (
"crypto/rand"
"encoding/base64"
"fmt"
"log"
)
func main() {
key := make([]byte, 64)
if _, err := rand.Read(key); err != nil {
log.Fatal(err)
}
secret := base64.StdEncoding.EncodeToString(key)
fmt.Println(secret)
}
After that, choose one of the following options (Docker or Local).
At the root of the project there is a Dockerfile and docker-compose.yml files with requirements to run the project. You can run with docker by building the image and running it.
Execute:
docker-compose up
You'll have API running on http://localhost
Set database configuration on .env
file and create the database. In docker folder, you will found a SQL script that will create database and tables.
# Install dependencies
go mod tidy
# Start application
go run ./cmd/api/main.go
If you want to generate the executable, use:
# Install dependencies
go mod tidy
# Generate executable
go build ./cmd/api
# Start application
./api
You'll have API running on http://localhost:8000 (if you don't change API_PORT
on .env
).
This project uses pressly/goose to manage migrations, which are located in the build/migrations folder. To execute them, install Goose:
go install github.com/pressly/goose/v3/cmd/goose@latest
Change variables and run:
goose -dir build/migrations postgres "postgresql://{DB_USER}:{DB_PASSWORD}@{DB_HOST}:5432/{DATABASE_NAME}?sslmode=disable" up
For convenience, you can set the database driver and connection string as environment variables:
export GOOSE_DRIVER=postgres
export GOOSE_DBSTRING=postgresql://db_user:your_password@db_host:5432/socialnets?sslmode=disable
And then, you can run the migration using a short command:
goose -dir build/migrations up
After starting application, you'll have access to following routes:
Method | URI | Authentication | Description |
---|---|---|---|
GET | /health | No | Application status health check |
POST | /api/login | No | User login |
POST | /api/user | No | Create an user |
GET | /api/user | Yes | Search for users |
GET | /api/user/{userId} | Yes | Get an user data |
PUT | /api/user/{userId} | Yes | Update an user data |
DELETE | /api/user/{userId} | Yes | Delete an user |
POST | /api/user/{userId}/follow | Yes | Logged user follows an user |
POST | /api/user/{userId}/unfollow | Yes | Logged user unfollows an user |
GET | /api/user/{userId}/followers | Yes | Get all followers by an user |
GET | /api/user/{userId}/following | Yes | Gets all users who are following a user |
POST | /api/user/{userId}/update-password | Yes | Update password user |
POST | /api/post | Yes | Create a post |
GET | /api/post | Yes | Get all post for a logged user |
GET | /api/post/{postId} | Yes | Get a post |
PUT | /api/post/{postId} | Yes | Update a post |
DELETE | /api/post/{postId} | Yes | Delete a post |
GET | /api/user/{userId}/posts | Yes | Gets all posts from a user |
POST | /api/post/{postId}/like | Yes | Like a user post |
POST | /api/post/{postId}/unlike | Yes | Unlike a user post |
Authentication, once performed with login (email) and password on /api/login
, is maintained via a JWT Bearer Token.
You can find more information, like payload and responses in the application swagger (coming soon).
So API is already to use.
To run tests run on root of the project:
go test ./...
Run at the root of the project to see tests coverage:
go test ./... --cover
🚧
Soon a swagger doc will be added.
-
Add GORM to the project - Improve tests
- Add Swagger documentation
- Implements UUID for user's Id
- Register who liked a post, so that each user can only like each post once, in addition to having information on who liked each post.
- Add likes table
- Control who like or unlike a post.
- Implements migrations
- Password recovery