Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
138 changes: 22 additions & 116 deletions main.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,6 @@ package main
import (
"database/sql"
"fmt"
"time"

_ "modernc.org/sqlite"
)
Expand All @@ -14,158 +13,65 @@ const (
ParcelStatusDelivered = "delivered"
)

type Parcel struct {
Number int
Client int
Status string
Address string
CreatedAt string
}

type ParcelService struct {
store ParcelStore
}

func NewParcelService(store ParcelStore) ParcelService {
return ParcelService{store: store}
}

func (s ParcelService) Register(client int, address string) (Parcel, error) {
parcel := Parcel{
Client: client,
Status: ParcelStatusRegistered,
Address: address,
CreatedAt: time.Now().UTC().Format(time.RFC3339),
}

id, err := s.store.Add(parcel)
if err != nil {
return parcel, err
}

parcel.Number = id

fmt.Printf("Новая посылка № %d на адрес %s от клиента с идентификатором %d зарегистрирована %s\n",
parcel.Number, parcel.Address, parcel.Client, parcel.CreatedAt)

return parcel, nil
}

func (s ParcelService) PrintClientParcels(client int) error {
parcels, err := s.store.GetByClient(client)
if err != nil {
return err
}

fmt.Printf("Посылки клиента %d:\n", client)
for _, parcel := range parcels {
fmt.Printf("Посылка № %d на адрес %s от клиента с идентификатором %d зарегистрирована %s, статус %s\n",
parcel.Number, parcel.Address, parcel.Client, parcel.CreatedAt, parcel.Status)
}
fmt.Println()

return nil
}

func (s ParcelService) NextStatus(number int) error {
parcel, err := s.store.Get(number)
func main() {
// Подключение к SQLite
db, err := sql.Open("sqlite", "tracker.db")
if err != nil {
return err
}

var nextStatus string
switch parcel.Status {
case ParcelStatusRegistered:
nextStatus = ParcelStatusSent
case ParcelStatusSent:
nextStatus = ParcelStatusDelivered
case ParcelStatusDelivered:
return nil
fmt.Println(err)
return
}
defer db.Close()

fmt.Printf("У посылки № %d новый статус: %s\n", number, nextStatus)

return s.store.SetStatus(number, nextStatus)
}

func (s ParcelService) ChangeAddress(number int, address string) error {
return s.store.SetAddress(number, address)
}

func (s ParcelService) Delete(number int) error {
return s.store.Delete(number)
}

func main() {
// настройте подключение к БД

store := // создайте объект ParcelStore функцией NewParcelStore
store := NewParcelStore(db)
service := NewParcelService(store)

// регистрация посылки
client := 1
address := "Псков, д. Пушкина, ул. Колотушкина, д. 5"
p, err := service.Register(client, address)
if err != nil {
fmt.Println(err)
return
}

// изменение адреса
newAddress := "Саратов, д. Верхние Зори, ул. Козлова, д. 25"
err = service.ChangeAddress(p.Number, newAddress)
// 1) Регистрация первой посылки
p1, err := service.Register(client, "Псков, д. Пушкина, ул. Колотушкина, д. 5")
if err != nil {
fmt.Println(err)
return
}

// изменение статуса
err = service.NextStatus(p.Number)
if err != nil {
// 2) Пока статус registered можно поменять адрес
if err := service.SetAddress(p1.Number, "Саратов, д. Верхние Зори, ул. Козлова, д. 25"); err != nil {
fmt.Println(err)
return
}

// вывод посылок клиента
err = service.PrintClientParcels(client)
if err != nil {
// 3) Отправляем первую посылку
if err := service.Send(p1.Number); err != nil {
fmt.Println(err)
return
}

// попытка удаления отправленной посылки
err = service.Delete(p.Number)
if err != nil {
// 4) Печать списка посылок клиента (должна отобразиться изменённая запись)
if err := service.PrintClientParcels(client); err != nil {
fmt.Println(err)
return
}

// вывод посылок клиента
// предыдущая посылка не должна удалиться, т.к. её статус НЕ «зарегистрирована»
err = service.PrintClientParcels(client)
if err != nil {
// 5) Ещё раз печать списка (повтор для демонстрации)
if err := service.PrintClientParcels(client); err != nil {
fmt.Println(err)
return
}

// регистрация новой посылки
p, err = service.Register(client, address)
// 6) Регистрируем вторую посылку и сразу удаляем (разрешено только в registered)
p2, err := service.Register(client, "Псков, д. Пушкина, ул. Колотушкина, д. 5")
if err != nil {
fmt.Println(err)
return
}

// удаление новой посылки
err = service.Delete(p.Number)
if err != nil {
if err := service.Delete(p2.Number); err != nil {
fmt.Println(err)
return
}

// вывод посылок клиента
// здесь не должно быть последней посылки, т.к. она должна была успешно удалиться
err = service.PrintClientParcels(client)
if err != nil {
// 7) Финальная печать — второй посылки быть не должно
if err := service.PrintClientParcels(client); err != nil {
fmt.Println(err)
return
}
Expand Down
Loading