Merge branch 'master' into hw09_generator_of_validators
commit
653a320758
|
@ -34,6 +34,9 @@ jobs:
|
||||||
name: "go get"
|
name: "go get"
|
||||||
install: echo "skip"
|
install: echo "skip"
|
||||||
script: cd /tmp && go get "github.com/${TRAVIS_REPO_SLUG}/${BRANCH}@${BRANCH}"
|
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"
|
- stage: "Tests"
|
||||||
name: "Linters"
|
name: "Linters"
|
||||||
|
|
|
@ -0,0 +1,2 @@
|
||||||
|
logs/
|
||||||
|
bin/
|
|
@ -1,10 +1,13 @@
|
||||||
build:
|
build:
|
||||||
go build ./... -o calendar
|
go build -o ./bin/calendar ./cmd/calendar
|
||||||
|
|
||||||
test:
|
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 ./...
|
golangci-lint run ./...
|
||||||
|
|
||||||
.PHONY: build
|
.PHONY: build test lint
|
||||||
|
|
|
@ -0,0 +1,7 @@
|
||||||
|
syntax = "proto3";
|
||||||
|
|
||||||
|
package event;
|
||||||
|
|
||||||
|
message Event {
|
||||||
|
// TODO
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package main
|
||||||
|
|
||||||
|
// При желании конфигурацию можно вынести в internal/config.
|
||||||
|
// Организация конфига в main принуждает нас сужать API компонентов, использовать
|
||||||
|
// при их конструировании только необходимые параметры, а также уменьшает вероятность циклической зависимости.
|
||||||
|
type Config struct {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewConfig() Config {
|
||||||
|
return Config{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
|
@ -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)
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,5 @@
|
||||||
|
[logger]
|
||||||
|
level = "INFO"
|
||||||
|
|
||||||
|
# TODO
|
||||||
|
# ...
|
|
@ -0,0 +1 @@
|
||||||
|
version: "3"
|
|
@ -1,7 +1,14 @@
|
||||||
## Домашнее задание №12 «Заготовка сервиса Календарь»
|
## Домашнее задание №12 «Заготовка сервиса Календарь»
|
||||||
Необходимо реализовать скелет сервиса «Календарь», который будет дорабатываться в дальнейшем.
|
Необходимо реализовать скелет сервиса «Календарь», который будет дорабатываться в дальнейшем.
|
||||||
|
|
||||||
Описание то, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD).
|
Описание того, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD).
|
||||||
|
|
||||||
|
---
|
||||||
|
В репозитории представлена заготовка сервиса, позволяющая понять, что вообще происходит и получить вектор для дальнейшей доработки.
|
||||||
|
|
||||||
|
Этот код можно менять/удалять/добавлять каким-угодно способом по усмотрению разработчика.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
На данный момент сервис будет состоять из следующих логически выделенных частей:
|
На данный момент сервис будет состоять из следующих логически выделенных частей:
|
||||||
|
|
||||||
|
@ -73,6 +80,8 @@
|
||||||
* https://github.com/jmoiron/sqlx
|
* https://github.com/jmoiron/sqlx
|
||||||
* https://github.com/pressly/goose#go-migrations
|
* https://github.com/pressly/goose#go-migrations
|
||||||
|
|
||||||
|
**Использовать ORM (например, gorm) не допускается**.
|
||||||
|
|
||||||
Календарь должен использовать хранилище через интерфейс.
|
Календарь должен использовать хранилище через интерфейс.
|
||||||
|
|
||||||
### 4) Запуск простого HTTP-сервера
|
### 4) Запуск простого HTTP-сервера
|
||||||
|
|
|
@ -3,10 +3,10 @@
|
||||||
### Общее описание
|
### Общее описание
|
||||||
Сервис "Календарь" представляет собой максимально упрощенный сервис для хранения календарных событий и оправки уведомлений.
|
Сервис "Календарь" представляет собой максимально упрощенный сервис для хранения календарных событий и оправки уведомлений.
|
||||||
|
|
||||||
Сервис предполагает:
|
Сервис предполагает возможность:
|
||||||
* возможность добавить/обновить событие;
|
* добавить/обновить событие;
|
||||||
* возможность получить список событий на день/неделю/месяц;
|
* получить список событий на день/неделю/месяц;
|
||||||
* возможность получить уведомление за N дней до события.
|
* получить уведомление за N дней до события.
|
||||||
|
|
||||||
Сервис НЕ предполагает:
|
Сервис НЕ предполагает:
|
||||||
* авторизации;
|
* авторизации;
|
||||||
|
@ -35,7 +35,7 @@ API предоставляет собой GRPC и HTTP интерфейсы дл
|
||||||
#### 4) СУБД
|
#### 4) СУБД
|
||||||
Реляционная СУБД (например, PostgreSQL) - хранит информацию о событиях.
|
Реляционная СУБД (например, PostgreSQL) - хранит информацию о событиях.
|
||||||
|
|
||||||
### 5) Очередь сообщений
|
#### 5) Очередь сообщений
|
||||||
Очередь сообщений (RabbitMQ) - используется для передачи уведомлений от Планировщика Рассыльщику.
|
Очередь сообщений (RabbitMQ) - используется для передачи уведомлений от Планировщика Рассыльщику.
|
||||||
|
|
||||||
### Описание сущностей
|
### Описание сущностей
|
||||||
|
@ -62,7 +62,7 @@ API предоставляет собой GRPC и HTTP интерфейсы дл
|
||||||
* Удалить (ID события);
|
* Удалить (ID события);
|
||||||
* СписокСобытийНаДень (дата);
|
* СписокСобытийНаДень (дата);
|
||||||
* СписокСобытийНаНеделю (дата начала недели);
|
* СписокСобытийНаНеделю (дата начала недели);
|
||||||
* СписокСобытийНеМесяц (дата начала месяца).
|
* СписокСобытийНaМесяц (дата начала месяца).
|
||||||
|
|
||||||
### Конфигурация, логирование, контейнеризация
|
### Конфигурация, логирование, контейнеризация
|
||||||
Рекомендуется собирать проект в виде трех бинарных файлов, по одному на каждый микросервис.
|
Рекомендуется собирать проект в виде трех бинарных файлов, по одному на каждый микросервис.
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
module github.com/fixme_my_friend/hw12_13_14_15_calendar
|
||||||
|
|
||||||
|
go 1.14
|
|
@ -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
|
|
@ -0,0 +1,11 @@
|
||||||
|
package logger
|
||||||
|
|
||||||
|
type Logger struct {
|
||||||
|
// TODO
|
||||||
|
}
|
||||||
|
|
||||||
|
func New(level string) *Logger {
|
||||||
|
return &Logger{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
|
@ -0,0 +1,7 @@
|
||||||
|
package logger
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestLogger(t *testing.T) {
|
||||||
|
// TODO
|
||||||
|
}
|
|
@ -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
|
||||||
|
})
|
||||||
|
}
|
|
@ -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
|
|
@ -0,0 +1,7 @@
|
||||||
|
package storage
|
||||||
|
|
||||||
|
type Event struct {
|
||||||
|
ID string
|
||||||
|
Title string
|
||||||
|
// TODO
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package memorystorage
|
||||||
|
|
||||||
|
import "sync"
|
||||||
|
|
||||||
|
type Storage struct {
|
||||||
|
// TODO
|
||||||
|
mu sync.RWMutex
|
||||||
|
}
|
||||||
|
|
||||||
|
func New() *Storage {
|
||||||
|
return &Storage{}
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO
|
|
@ -0,0 +1,7 @@
|
||||||
|
package memorystorage
|
||||||
|
|
||||||
|
import "testing"
|
||||||
|
|
||||||
|
func TestStorage(t *testing.T) {
|
||||||
|
// TODO
|
||||||
|
}
|
|
@ -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
|
||||||
|
}
|
Loading…
Reference in New Issue