diff --git a/.travis.yml b/.travis.yml index dc195be..62d697c 100644 --- a/.travis.yml +++ b/.travis.yml @@ -34,6 +34,9 @@ jobs: name: "go get" install: echo "skip" script: cd /tmp && go get "github.com/${TRAVIS_REPO_SLUG}/${BRANCH}@${BRANCH}" + if: | + (type = push AND branch != hw12_13_14_15_calendar) OR \ + (type = pull_request AND head_branch != hw12_13_14_15_calendar) - stage: "Tests" name: "Linters" diff --git a/hw12_13_14_15_calendar/.gitignore b/hw12_13_14_15_calendar/.gitignore new file mode 100644 index 0000000..5191260 --- /dev/null +++ b/hw12_13_14_15_calendar/.gitignore @@ -0,0 +1,2 @@ +logs/ +bin/ diff --git a/hw12_13_14_15_calendar/Makefile b/hw12_13_14_15_calendar/Makefile index 02e0f7f..733d4d1 100644 --- a/hw12_13_14_15_calendar/Makefile +++ b/hw12_13_14_15_calendar/Makefile @@ -1,10 +1,13 @@ build: - go build ./... -o calendar + go build -o ./bin/calendar ./cmd/calendar test: - go test -race ./... + go test -race ./internal/... ./pkg/... -lint: +install-lint-deps: + (which golangci-lint > /dev/null) || curl -sSfL https://raw.githubusercontent.com/golangci/golangci-lint/master/install.sh | sh -s -- -b $(go env GOPATH)/bin v1.30.0 + +lint: install-lint-deps golangci-lint run ./... -.PHONY: build +.PHONY: build test lint diff --git a/hw12_13_14_15_calendar/api/EventService.proto b/hw12_13_14_15_calendar/api/EventService.proto new file mode 100644 index 0000000..d188eff --- /dev/null +++ b/hw12_13_14_15_calendar/api/EventService.proto @@ -0,0 +1,7 @@ +syntax = "proto3"; + +package event; + +message Event { + // TODO +} diff --git a/hw12_13_14_15_calendar/cmd/calendar/config.go b/hw12_13_14_15_calendar/cmd/calendar/config.go new file mode 100644 index 0000000..1d35a47 --- /dev/null +++ b/hw12_13_14_15_calendar/cmd/calendar/config.go @@ -0,0 +1,14 @@ +package main + +// При желании конфигурацию можно вынести в internal/config. +// Организация конфига в main принуждает нас сужать API компонентов, использовать +// при их конструировании только необходимые параметры, а также уменьшает вероятность циклической зависимости. +type Config struct { + // TODO +} + +func NewConfig() Config { + return Config{} +} + +// TODO diff --git a/hw12_13_14_15_calendar/cmd/calendar/main.go b/hw12_13_14_15_calendar/cmd/calendar/main.go new file mode 100644 index 0000000..ceaa900 --- /dev/null +++ b/hw12_13_14_15_calendar/cmd/calendar/main.go @@ -0,0 +1,45 @@ +package main + +import ( + "flag" + "os" + "os/signal" + + "github.com/fixme_my_friend/hw12_13_14_15_calendar/internal/app" + "github.com/fixme_my_friend/hw12_13_14_15_calendar/internal/logger" + internalhttp "github.com/fixme_my_friend/hw12_13_14_15_calendar/internal/server/http" + memorystorage "github.com/fixme_my_friend/hw12_13_14_15_calendar/internal/storage/memory" +) + +var configFile string + +func init() { + flag.StringVar(&configFile, "config", "/etc/calendar/config.toml", "Path to configuration file") +} + +func main() { + config := NewConfig() + logg := logger.New(config.Logger.Level) + + storage := memorystorage.New() + calendar := app.New(logg, storage) + + server := internalhttp.NewServer(calendar) + + go func() { + signals := make(chan os.Signal, 1) + signal.Notify(signals) + + <-signals + signal.Stop(signals) + + if err := server.Stop(); err != nil { + logger.Error("failed to stop http server: " + err.String()) + } + }() + + if err := server.Start(); err != nil { + logger.Error("failed to start http server: " + err.String()) + os.Exit(1) + } +} diff --git a/hw12_13_14_15_calendar/configs/config.toml b/hw12_13_14_15_calendar/configs/config.toml new file mode 100644 index 0000000..5b33eb0 --- /dev/null +++ b/hw12_13_14_15_calendar/configs/config.toml @@ -0,0 +1,5 @@ +[logger] +level = "INFO" + +# TODO +# ... diff --git a/hw12_13_14_15_calendar/deployments/docker-compose.yaml b/hw12_13_14_15_calendar/deployments/docker-compose.yaml new file mode 100644 index 0000000..5db6fe9 --- /dev/null +++ b/hw12_13_14_15_calendar/deployments/docker-compose.yaml @@ -0,0 +1 @@ +version: "3" diff --git a/hw12_13_14_15_calendar/docs/12_README.md b/hw12_13_14_15_calendar/docs/12_README.md index 86e9931..c075dcc 100644 --- a/hw12_13_14_15_calendar/docs/12_README.md +++ b/hw12_13_14_15_calendar/docs/12_README.md @@ -1,7 +1,14 @@ ## Домашнее задание №12 «Заготовка сервиса Календарь» Необходимо реализовать скелет сервиса «Календарь», который будет дорабатываться в дальнейшем. -Описание то, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD). +Описание того, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD). + +--- +В репозитории представлена заготовка сервиса, позволяющая понять, что вообще происходит и получить вектор для дальнейшей доработки. + +Этот код можно менять/удалять/добавлять каким-угодно способом по усмотрению разработчика. + +--- На данный момент сервис будет состоять из следующих логически выделенных частей: @@ -73,6 +80,8 @@ * https://github.com/jmoiron/sqlx * https://github.com/pressly/goose#go-migrations +**Использовать ORM (например, gorm) не допускается**. + Календарь должен использовать хранилище через интерфейс. ### 4) Запуск простого HTTP-сервера diff --git a/hw12_13_14_15_calendar/docs/CALENDAR.MD b/hw12_13_14_15_calendar/docs/CALENDAR.MD index 9207eab..6542a89 100644 --- a/hw12_13_14_15_calendar/docs/CALENDAR.MD +++ b/hw12_13_14_15_calendar/docs/CALENDAR.MD @@ -3,10 +3,10 @@ ### Общее описание Сервис "Календарь" представляет собой максимально упрощенный сервис для хранения календарных событий и оправки уведомлений. -Сервис предполагает: -* возможность добавить/обновить событие; -* возможность получить список событий на день/неделю/месяц; -* возможность получить уведомление за N дней до события. +Сервис предполагает возможность: +* добавить/обновить событие; +* получить список событий на день/неделю/месяц; +* получить уведомление за N дней до события. Сервис НЕ предполагает: * авторизации; @@ -35,7 +35,7 @@ API предоставляет собой GRPC и HTTP интерфейсы дл #### 4) СУБД Реляционная СУБД (например, PostgreSQL) - хранит информацию о событиях. -### 5) Очередь сообщений +#### 5) Очередь сообщений Очередь сообщений (RabbitMQ) - используется для передачи уведомлений от Планировщика Рассыльщику. ### Описание сущностей @@ -62,7 +62,7 @@ API предоставляет собой GRPC и HTTP интерфейсы дл * Удалить (ID события); * СписокСобытийНаДень (дата); * СписокСобытийНаНеделю (дата начала недели); -* СписокСобытийНеМесяц (дата начала месяца). +* СписокСобытийНaМесяц (дата начала месяца). ### Конфигурация, логирование, контейнеризация Рекомендуется собирать проект в виде трех бинарных файлов, по одному на каждый микросервис. diff --git a/hw12_13_14_15_calendar/go.mod b/hw12_13_14_15_calendar/go.mod new file mode 100644 index 0000000..3eb18a3 --- /dev/null +++ b/hw12_13_14_15_calendar/go.mod @@ -0,0 +1,3 @@ +module github.com/fixme_my_friend/hw12_13_14_15_calendar + +go 1.14 diff --git a/hw12_13_14_15_calendar/internal/app/app.go b/hw12_13_14_15_calendar/internal/app/app.go new file mode 100644 index 0000000..bbbdaea --- /dev/null +++ b/hw12_13_14_15_calendar/internal/app/app.go @@ -0,0 +1,29 @@ +package app + +import ( + "context" + + "github.com/fixme_my_friend/hw12_13_14_15_calendar/internal/storage" +) + +type App struct { + // TODO +} + +type Logger interface { + // TODO +} + +type Storage interface { + // TODO +} + +func New(logger Logger, storage Storage) *App { + return &App{} +} + +func (a *App) CreateEvent(ctx context.Context, id string, title string) error { + return a.storage.CreateEvent(storage.Event{ID: id, Title: title}) +} + +// TODO diff --git a/hw12_13_14_15_calendar/internal/logger/logger.go b/hw12_13_14_15_calendar/internal/logger/logger.go new file mode 100644 index 0000000..bdba951 --- /dev/null +++ b/hw12_13_14_15_calendar/internal/logger/logger.go @@ -0,0 +1,11 @@ +package logger + +type Logger struct { + // TODO +} + +func New(level string) *Logger { + return &Logger{} +} + +// TODO diff --git a/hw12_13_14_15_calendar/internal/logger/logger_test.go b/hw12_13_14_15_calendar/internal/logger/logger_test.go new file mode 100644 index 0000000..34bb72c --- /dev/null +++ b/hw12_13_14_15_calendar/internal/logger/logger_test.go @@ -0,0 +1,7 @@ +package logger + +import "testing" + +func TestLogger(t *testing.T) { + // TODO +} diff --git a/hw12_13_14_15_calendar/internal/server/http/middleware.go b/hw12_13_14_15_calendar/internal/server/http/middleware.go new file mode 100644 index 0000000..803cade --- /dev/null +++ b/hw12_13_14_15_calendar/internal/server/http/middleware.go @@ -0,0 +1,11 @@ +package internalhttp + +import ( + "net/http" +) + +func loggingMiddleware(next http.Handler) http.Handler { + return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // TODO + }) +} diff --git a/hw12_13_14_15_calendar/internal/server/http/server.go b/hw12_13_14_15_calendar/internal/server/http/server.go new file mode 100644 index 0000000..cdbefb8 --- /dev/null +++ b/hw12_13_14_15_calendar/internal/server/http/server.go @@ -0,0 +1,26 @@ +package internalhttp + +import "context" + +type Server struct { + // TODO +} + +type Application interface { + // TODO +} + +func NewServer(app Application) *Server { + return &Server{} +} + +func (s *Server) Start() error { + // TODO +} + +func (s *Server) Stop() error { + ctx, cancel := context.WithTimeout(context.Background(), shutdownTimeout) + // TODO +} + +// TODO diff --git a/hw12_13_14_15_calendar/internal/storage/event.go b/hw12_13_14_15_calendar/internal/storage/event.go new file mode 100644 index 0000000..39b2d1a --- /dev/null +++ b/hw12_13_14_15_calendar/internal/storage/event.go @@ -0,0 +1,7 @@ +package storage + +type Event struct { + ID string + Title string + // TODO +} diff --git a/hw12_13_14_15_calendar/internal/storage/memory/storage.go b/hw12_13_14_15_calendar/internal/storage/memory/storage.go new file mode 100644 index 0000000..bbc033d --- /dev/null +++ b/hw12_13_14_15_calendar/internal/storage/memory/storage.go @@ -0,0 +1,14 @@ +package memorystorage + +import "sync" + +type Storage struct { + // TODO + mu sync.RWMutex +} + +func New() *Storage { + return &Storage{} +} + +// TODO diff --git a/hw12_13_14_15_calendar/internal/storage/memory/storage_test.go b/hw12_13_14_15_calendar/internal/storage/memory/storage_test.go new file mode 100644 index 0000000..7e303bc --- /dev/null +++ b/hw12_13_14_15_calendar/internal/storage/memory/storage_test.go @@ -0,0 +1,7 @@ +package memorystorage + +import "testing" + +func TestStorage(t *testing.T) { + // TODO +} diff --git a/hw12_13_14_15_calendar/internal/storage/sql/storage.go b/hw12_13_14_15_calendar/internal/storage/sql/storage.go new file mode 100644 index 0000000..5845045 --- /dev/null +++ b/hw12_13_14_15_calendar/internal/storage/sql/storage.go @@ -0,0 +1,19 @@ +package sqlstorage + +import "context" + +type Storage struct { + // TODO +} + +func New() *Storage { + return &Storage{} +} + +func (s *Storage) Connect(ctx context.Context) error { + // TODO +} + +func (s *Storage) Close(ctx context.Context) error { + // TODO +} diff --git a/hw12_13_14_15_calendar/migrations/.gitkeep b/hw12_13_14_15_calendar/migrations/.gitkeep new file mode 100644 index 0000000..e69de29