commit 10748c612b80cfd7adc6d7491839092e76c74672 Author: lbenedar Date: Tue Mar 10 14:31:03 2026 +0300 ch2 diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..e69de29 diff --git a/cmd/api/healthcheck.go b/cmd/api/healthcheck.go new file mode 100644 index 0000000..68bed0d --- /dev/null +++ b/cmd/api/healthcheck.go @@ -0,0 +1,12 @@ +package main + +import ( + "fmt" + "net/http" +) + +func (app *application) healthcheckHandler(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "status: available") + fmt.Fprintf(w, "environment: %s\n", app.config.env) + fmt.Fprintf(w, "version: %s\n", version) +} diff --git a/cmd/api/helpers.go b/cmd/api/helpers.go new file mode 100644 index 0000000..3101377 --- /dev/null +++ b/cmd/api/helpers.go @@ -0,0 +1,19 @@ +package main + +import ( + "errors" + "net/http" + "strconv" + + "github.com/julienschmidt/httprouter" +) + +func (app *application) readIDParam(r *http.Request) (int64, error) { + params := httprouter.ParamsFromContext(r.Context()) + + id, err := strconv.ParseInt(params.ByName("id"), 10, 64) + if err != nil || id < 1 { + return 0, errors.New("invalid id parameter") + } + return id, nil +} diff --git a/cmd/api/main.go b/cmd/api/main.go new file mode 100644 index 0000000..cc66c16 --- /dev/null +++ b/cmd/api/main.go @@ -0,0 +1,48 @@ +package main + +import ( + "flag" + "fmt" + "log" + "net/http" + "os" + "time" +) + +const version = "1.0.0" + +type application struct { + config config + logger *log.Logger +} + +type config struct { + port int + env string +} + +func main() { + var cfg config + + flag.IntVar(&cfg.port, "port", 4000, "API server port") + flag.StringVar(&cfg.env, "env", "development", "Enivornment (development|staging|production)") + flag.Parse() + + logger := log.New(os.Stdout, "", log.Ldate|log.Ltime) + + app := &application{ + config: cfg, + logger: logger, + } + + srv := &http.Server{ + Addr: fmt.Sprintf(":%d", app.config.port), + Handler: app.routes(), + IdleTimeout: time.Minute, + ReadTimeout: 10 * time.Second, + WriteTimeout: 10 * time.Second, + } + logger.Printf("starting %s server on %s", cfg.env, srv.Addr) + err := srv.ListenAndServe() + logger.Fatal(err) +} diff --git a/cmd/api/movies.go b/cmd/api/movies.go new file mode 100644 index 0000000..5b2ddab --- /dev/null +++ b/cmd/api/movies.go @@ -0,0 +1,19 @@ +package main + +import ( + "fmt" + "net/http" +) + +func (app *application) createMovieHandler(w http.ResponseWriter, r *http.Request) { + fmt.Fprintln(w, "create a new movie") +} + +func (app *application) showMovieHandler(w http.ResponseWriter, r *http.Request) { + id, err := app.readIDParam(r) + if err != nil { + http.NotFound(w, r) + return + } + fmt.Fprintf(w, "show the details of movie %d\n", id) +} diff --git a/cmd/api/routes.go b/cmd/api/routes.go new file mode 100644 index 0000000..ade1227 --- /dev/null +++ b/cmd/api/routes.go @@ -0,0 +1,17 @@ +package main + +import ( + "net/http" + + "github.com/julienschmidt/httprouter" +) + +func (app *application) routes() *httprouter.Router { + router := httprouter.New() + + router.HandlerFunc(http.MethodGet, "/v1/healtcheck", app.healthcheckHandler) + router.HandlerFunc(http.MethodPost, "/v1/movies", app.createMovieHandler) + router.HandlerFunc(http.MethodGet, "/v1/movies/:id", app.showMovieHandler) + + return router +} diff --git a/go.mod b/go.mod new file mode 100644 index 0000000..c3aec90 --- /dev/null +++ b/go.mod @@ -0,0 +1,5 @@ +module gitea.local.lab/Lbenedar/greenlight + +go 1.25.0 + +require github.com/julienschmidt/httprouter v1.3.0 // indirect diff --git a/go.sum b/go.sum new file mode 100644 index 0000000..096c54e --- /dev/null +++ b/go.sum @@ -0,0 +1,2 @@ +github.com/julienschmidt/httprouter v1.3.0 h1:U0609e9tgbseu3rBINet9P48AI/D3oJs4dN7jwJOQ1U= +github.com/julienschmidt/httprouter v1.3.0/go.mod h1:JR6WtHb+2LUe8TCKY3cZOxFyyO8IZAc4RVcycCCAKdM=