Обновление 12-й домашки

pull/10/head^2
Andrey Ivanov 2020-08-18 10:38:54 +03:00 committed by Andrey Ivanov
parent cf997fd4e6
commit f51d961115
21 changed files with 234 additions and 11 deletions

View File

@ -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"

2
hw12_13_14_15_calendar/.gitignore vendored Normal file
View File

@ -0,0 +1,2 @@
logs/
bin/

View File

@ -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

View File

@ -0,0 +1,7 @@
syntax = "proto3";
package event;
message Event {
// TODO
}

View File

@ -0,0 +1,14 @@
package main
// При желании конфигурацию можно вынести в internal/config.
// Организация конфига в main принуждает нас сужать API компонентов, использовать
// при их конструировании только необходимые параметры, а также уменьшает вероятность циклической зависимости.
type Config struct {
// TODO
}
func NewConfig() Config {
return Config{}
}
// TODO

View File

@ -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)
}
}

View File

@ -0,0 +1,5 @@
[logger]
level = "INFO"
# TODO
# ...

View File

@ -0,0 +1 @@
version: "3"

View File

@ -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-сервера

View File

@ -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Месяц (дата начала месяца).
### Конфигурация, логирование, контейнеризация
Рекомендуется собирать проект в виде трех бинарных файлов, по одному на каждый микросервис.

View File

@ -0,0 +1,3 @@
module github.com/fixme_my_friend/hw12_13_14_15_calendar
go 1.14

View File

@ -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

View File

@ -0,0 +1,11 @@
package logger
type Logger struct {
// TODO
}
func New(level string) *Logger {
return &Logger{}
}
// TODO

View File

@ -0,0 +1,7 @@
package logger
import "testing"
func TestLogger(t *testing.T) {
// TODO
}

View File

@ -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
})
}

View File

@ -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

View File

@ -0,0 +1,7 @@
package storage
type Event struct {
ID string
Title string
// TODO
}

View File

@ -0,0 +1,14 @@
package memorystorage
import "sync"
type Storage struct {
// TODO
mu sync.RWMutex
}
func New() *Storage {
return &Storage{}
}
// TODO

View File

@ -0,0 +1,7 @@
package memorystorage
import "testing"
func TestStorage(t *testing.T) {
// TODO
}

View File

@ -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
}