diff --git a/backend-go/cmd/codepair/main.go b/backend-go/cmd/codepair/main.go index cd7a16fc..b65106d9 100644 --- a/backend-go/cmd/codepair/main.go +++ b/backend-go/cmd/codepair/main.go @@ -1,17 +1,17 @@ package main import ( - "fmt" - "net/http" - "github.com/labstack/echo/v4" + "github.com/yorkie-team/codepair/backend/internal/config" + "github.com/yorkie-team/codepair/backend/internal/server" ) func main() { e := echo.New() - e.GET("/", func(c echo.Context) error { - err := c.String(http.StatusOK, "Hello, World!") - return fmt.Errorf("error: %w", err) - }) - e.Logger.Fatal(e.Start(":3001")) + conf := config.LoadConfig() + cp := server.New(e, conf) + + if err := cp.Start(); err != nil { + e.Logger.Fatal(err) + } } diff --git a/backend-go/config.yaml b/backend-go/config.yaml new file mode 100644 index 00000000..e69de29b diff --git a/backend-go/design/directory_structure.md b/backend-go/design/directory_structure.md new file mode 100644 index 00000000..8b27cba4 --- /dev/null +++ b/backend-go/design/directory_structure.md @@ -0,0 +1,74 @@ +# Directory Structure + +This document explains the purpose and structure of the project's directories. + +## Project Structure + +``` +backend-go/ +├── api # DTO definitions +├── bin # Compiled binaries +├── cmd # Application entry points +│ └── codepair # Main application entry point (main.go) +├── design # Design documents and architecture references +└── internal # Core application logic (business logic, infrastructure, middleware) +``` +### Structure of `internal` + +``` +internal +├── config # Configuration loading & validation +├── core # Business logic and domain entities +│ ├── workspace # Workspace management module +│ ├── user # User management module +│ └── ... # Other domain-specific modules +├── infra # Infrastructure dependencies (DB, storage, external services) +│ ├── database # Database integrations +│ │ └── mongo # MongoDB implementation +│ ├── storage # Object storage (MinIO, S3, etc.) +│ │ ├── minio # MinIO storage implementation +│ │ └── s3 # AWS S3 storage implementation +│ └── yorkie # Yorkie admin client implementation +├── middleware # Shared middleware (logging, auth, etc.) +└── server # Server setup, routing, and bootstrapping +``` + +### Explanation of Each Component + +#### 1. `internal/config` + +- Responsible for **loading and validating configurations** (e.g., using `viper` or `os.Getenv`). +- Contains separate configuration files for authentication, database, and other settings. + +#### 2. `internal/core` + +- Contains the **business logic and domain models**. +- Each domain (e.g., `workspace`, `user`) includes: + - `model.go` → Defines entity structures (e.g., `User`, `Workspace`). + - `repository.go` → Interface for database operations. + - `service.go` → Implementation of business logic. + - `handler.go` → Presentation layer handlers for processing HTTP requests. + +#### 3. `internal/infra` + +- Represents the **infrastructure layer** responsible for handling external dependencies such as databases, storage, and external services. +- Organized into: + - `database/mongo/` → MongoDB implementation for repositories. + - `storage/` → Object storage implementations (MinIO, S3). + - `yorkie/` → Contains the Yorkie admin client, which handles administrative functions. + +#### 4. `internal/middleware` + +- Contains **shared middleware** applied across the application. +- Common middleware includes: + - Logging + - Authentication & authorization + - Error handling & panic recovery + - Request validation + +#### 5. `internal/server` + +- Handles **server setup and routing**. +- Includes: + - `routes.go` → Defines API endpoints and middleware. + - `server.go` → Initializes the server, sets up dependencies, and starts the application. diff --git a/backend-go/internal/config/config.go b/backend-go/internal/config/config.go new file mode 100644 index 00000000..d32ecf4a --- /dev/null +++ b/backend-go/internal/config/config.go @@ -0,0 +1,13 @@ +package config + +type Config struct { + Server *Server +} + +func LoadConfig() *Config { + return &Config{ + Server: &Server{ + Port: DefaultServerPort, + }, + } +} diff --git a/backend-go/internal/config/server.go b/backend-go/internal/config/server.go new file mode 100644 index 00000000..9316bc81 --- /dev/null +++ b/backend-go/internal/config/server.go @@ -0,0 +1,9 @@ +package config + +const ( + DefaultServerPort = 3001 +) + +type Server struct { + Port int +} diff --git a/backend-go/internal/core/user/model.go b/backend-go/internal/core/user/model.go new file mode 100644 index 00000000..a00006b6 --- /dev/null +++ b/backend-go/internal/core/user/model.go @@ -0,0 +1 @@ +package user diff --git a/backend-go/internal/core/user/repository.go b/backend-go/internal/core/user/repository.go new file mode 100644 index 00000000..a00006b6 --- /dev/null +++ b/backend-go/internal/core/user/repository.go @@ -0,0 +1 @@ +package user diff --git a/backend-go/internal/core/user/service.go b/backend-go/internal/core/user/service.go new file mode 100644 index 00000000..a00006b6 --- /dev/null +++ b/backend-go/internal/core/user/service.go @@ -0,0 +1 @@ +package user diff --git a/backend-go/internal/infra/database/mongo/.gitkeep b/backend-go/internal/infra/database/mongo/.gitkeep new file mode 100644 index 00000000..8b137891 --- /dev/null +++ b/backend-go/internal/infra/database/mongo/.gitkeep @@ -0,0 +1 @@ + diff --git a/backend-go/internal/infra/storage/minio/.gitkeep b/backend-go/internal/infra/storage/minio/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/backend-go/internal/infra/storage/s3/.gitkeep b/backend-go/internal/infra/storage/s3/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/backend-go/internal/infra/yorkie/.gitkeep b/backend-go/internal/infra/yorkie/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/backend-go/internal/middleware/.gitkeep b/backend-go/internal/middleware/.gitkeep new file mode 100644 index 00000000..e69de29b diff --git a/backend-go/internal/server/routes.go b/backend-go/internal/server/routes.go new file mode 100644 index 00000000..f5567099 --- /dev/null +++ b/backend-go/internal/server/routes.go @@ -0,0 +1,15 @@ +package server + +import ( + "fmt" + "net/http" + + "github.com/labstack/echo/v4" +) + +func RegisterRoutes(e *echo.Echo) { + e.GET("/", func(c echo.Context) error { + err := c.String(http.StatusOK, "Hello, World!") + return fmt.Errorf("error: %w", err) + }) +} diff --git a/backend-go/internal/server/server.go b/backend-go/internal/server/server.go new file mode 100644 index 00000000..022f3469 --- /dev/null +++ b/backend-go/internal/server/server.go @@ -0,0 +1,34 @@ +package server + +import ( + "errors" + "fmt" + "net/http" + + "github.com/labstack/echo/v4" + + "github.com/yorkie-team/codepair/backend/internal/config" +) + +type CodePair struct { + config *config.Config + echo *echo.Echo +} + +func New(e *echo.Echo, conf *config.Config) *CodePair { + RegisterRoutes(e) + + cp := &CodePair{ + config: conf, + echo: e, + } + return cp +} + +func (c *CodePair) Start() error { + addr := fmt.Sprintf(":%d", c.config.Server.Port) + if err := c.echo.Start(addr); !errors.Is(err, http.ErrServerClosed) { + return fmt.Errorf("failed to start server: %w", err) + } + return nil +}