Обновление 12-й домашки
parent
cf997fd4e6
commit
f51d961115
|
@ -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"
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
logs/
|
||||
bin/
|
|
@ -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
|
||||
|
|
|
@ -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 «Заготовка сервиса Календарь»
|
||||
Необходимо реализовать скелет сервиса «Календарь», который будет дорабатываться в дальнейшем.
|
||||
|
||||
Описание то, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD).
|
||||
Описание того, к чему мы должны придти, представлено [в техническом задании](./CALENDAR.MD).
|
||||
|
||||
---
|
||||
В репозитории представлена заготовка сервиса, позволяющая понять, что вообще происходит и получить вектор для дальнейшей доработки.
|
||||
|
||||
Этот код можно менять/удалять/добавлять каким-угодно способом по усмотрению разработчика.
|
||||
|
||||
---
|
||||
|
||||
На данный момент сервис будет состоять из следующих логически выделенных частей:
|
||||
|
||||
|
@ -73,6 +80,8 @@
|
|||
* https://github.com/jmoiron/sqlx
|
||||
* https://github.com/pressly/goose#go-migrations
|
||||
|
||||
**Использовать ORM (например, gorm) не допускается**.
|
||||
|
||||
Календарь должен использовать хранилище через интерфейс.
|
||||
|
||||
### 4) Запуск простого HTTP-сервера
|
||||
|
|
|
@ -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Месяц (дата начала месяца).
|
||||
|
||||
### Конфигурация, логирование, контейнеризация
|
||||
Рекомендуется собирать проект в виде трех бинарных файлов, по одному на каждый микросервис.
|
||||
|
|
|
@ -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