1) Пакет "storage" содержит Interface, который задаёт контракт на работу с БД.
pkg\storage\storage.go
Программа использует две схемы таблиц и методы для работы с ними:
Author - автор
type Author struct {
ID int64 json:"id"
Name string json:"name"
}
Authors() ([]Author, error) // получение всех авторов
AddAuthor(Author) (int64, error) // создание нового автора
UpdateAuthor(Author) (int64, error) // обновление списка авторов
DeleteAuthor(Author) (int64, error) // удаление автора по ID
InsertInitDataFromFileAuthors(string) error // загрузить данные из файла
Post - публикация
type Post struct {
ID int64 json:"id"
AuthorID int64 json:"author_id"
AuthorName string json:"author_name"
Title string json:"title"
Content string json:"content"
CreatedAt int64 json:"created_at"
CreatedAtTxt string json:"created_at_txt"
PublishedAt int64 json:"published_at"
PublishedAtTxt string json:"published_at_txt"
}
Posts() ([]Post, error) // получение всех публикаций
AddPost(Post) (int64, error) // создание новой публикации
UpdatePost(Post) (int64, error) // обновление публикации
DeletePost(Post) (int64, error) // удаление публикации по ID
InsertInitDataFromFilePosts(string) error // загрузить данные из файла
Есть возможность предварительной загрузки данных из файлов:
- Author:
cmd\server\ui\database\tableAuthors.json
- Post:
cmd\server\ui\database\tablePosts.json
2) Пакет "api" реализует характерную для REST API схему запросов для работы с БД.
pkg\api\api.go
Запросы приходят на URL, соответствующий коллекции ресурсов:
- коллекции авторов "/authors"
- коллекции статей "/posts"
Для обозначения действий над коллекцией используются методы протокола HTTP:
-
POST для создания ресурса
api.router.HandleFunc("/authors", api.addAuthorHandler).Methods(http.MethodPost, http.MethodOptions)
api.router.HandleFunc("/posts", api.addPostHandler).Methods(http.MethodPost, http.MethodOptions) -
DELETE для удаления
api.router.HandleFunc("/authors", api.deleteAuthorHandler).Methods(http.MethodDelete, http.MethodOptions)
api.router.HandleFunc("/posts", api.deletePostHandler).Methods(http.MethodDelete, http.MethodOptions) -
PUT для обновления
api.router.HandleFunc("/authors", api.updateAuthorHandler).Methods(http.MethodPut, http.MethodOptions)
api.router.HandleFunc("/posts", api.updatePostHandler).Methods(http.MethodPut, http.MethodOptions) -
GET для получения данных
api.router.HandleFunc("/authors", api.authorsHandler).Methods(http.MethodGet, http.MethodOptions)
api.router.HandleFunc("/posts", api.postsHandler).Methods(http.MethodGet, http.MethodOptions)
3) Для визуализации и организации REST API схемы запросов используется HTML+Javascript:
cmd\server\ui\html\base.html
cmd\server\ui\html\routes.html
4) Сервер хранит всю информацию в базе данных.
Сервер предоставляет следующие реализации хранилища данных:
-
postgres: По аналогии с пакетом "memdb" разработан пакет "postgres" для поддержки базы данных под управлением СУБД PostgreSQL.
pkg\storage\postgres\postgres.go
cmd\server\ui\database\schema.sql - схема БД PostgreSQL в форме SQL-запроса -
memdb: Модернизирован пакет "memdb" реализована hash-структура для хранения данных.
pkg\storage\memdb\memdb.go
type Store struct { AuthorsDB map[int64]storage.Author PostsDB map[int64]storage.Post } -
mongo: По аналогии с пакетом "memdb" разработан пакет "mongo" для поддержки базы данных под управлением MongoDB.
pkg\storage\mongo\mongo.go -
redis: По аналогии с пакетом "memdb" разработан пакет "redis" для поддержки базы данных под управлением Redis.
pkg\storage\redis\redis.go
5) Для регистрации ошибок обращения к БД создан пакет logger.
pkg\logger\logger.go
cmd\server\ui\database\log.json
- файл для хранения сообщений
- Сервер GoNews, который мы разрабатываем, должен предоставлять REST API, позволяющий выполнять следующие операции:
- Получение списка всех статей из БД,
- Добавление статьи в БД,
- Обновление статьи в БД,
- Удаление статьи из БД.
- Сервер должен предоставлять данные в ответ на запросы по протоколу HTTP.
- Сервер должен использовать характерную для REST API схему запросов:
- Запросы должны приходить на URL, соответствующий коллекции ресурсов. Например, коллекция статей.
- Для обозначения действий над коллекцией должны использоваться методы протокола HTTP: POST для создания ресурса, DELETE для удаления, PUT для обновления и GET для получения данных.
- Сервер должен хранить всю информацию в базе данных.
- Сервер должен предоставить как минимум две реализации хранилища данных: одну для реляционной СУБД и одну для документной.
- Объекты статьи должны содержать следующую информацию:
- Идентификатор,
- Имя автора,
- Заголовок,
- Текст,
- Время создания.
Для решения задачи от вас требуется следующее:
- Разработать схему БД PostgreSQL в форме SQL-запроса. Запрос должен быть помещён в файл schema.sql в корневой каталог проекта.
- По аналогии с пакетом "memdb" разработать пакет "postgres" для поддержки базы данных под управлением СУБД PostgreSQL.
- По аналогии с пакетом "memdb" разработать пакет "mongo" для поддержки базы данных под управлением СУБД MongoDB.
Все выше перечисленные требования к системе учтены в проекте.
- 1: package postgres: add tables authors, posts and functions for working with it
- 2: package memdb: modified package, added hash structure for tables authors, posts
- 3: package mongo: add tables authors, posts and functions for working with it
- 4: package redis: add tables authors, posts and functions for working with it
1.Enter this command to start the program:
go run server.go -typebd pg -loadbd yes
- typebd: This parameter is responsible for selecting the database.
- pg - PostgreSQL
- mem - memdb(map)
- mongo - MongoDB
- redis - Redis
- loadbd: This parameter determines whether to preload the database from a file or not.
- yes - preload the database from a file
- no - not
go run server.go
defualt value (-typebd mem -loadbd yes)
2.Open the web browser and go to:
http://127.0.0.1:8080/ or localhost:8080
@PolinaSvet
!!! It is for test now !!!
