generated from VLADIMIR/template
updates
This commit is contained in:
@@ -45,24 +45,29 @@ func (p *ScheduleParser) Run(ctx context.Context) {
|
||||
defer ticker.Stop()
|
||||
|
||||
sheetURL := "https://docs.google.com/spreadsheets/d/1v57bCAG764j1ULXDMb3amNFMzkkLmObKWsl5oE0Xq00/edit?gid=57461713#gid=57461713"
|
||||
p.parseAndSaveSchedule(ctx, sheetURL)
|
||||
for {
|
||||
select {
|
||||
case <-ctx.Done():
|
||||
return
|
||||
case <-ticker.C:
|
||||
days, err := p.parseSchedule(ctx, sheetURL)
|
||||
if err != nil {
|
||||
log.Printf("Error parse schedule: %s\n", sheetURL)
|
||||
break
|
||||
}
|
||||
if err := p.scheduleStorage.SaveSchedule(days); err != nil {
|
||||
log.Printf("Error save err: %s schedule: %s\n", err, sheetURL)
|
||||
}
|
||||
p.parseAndSaveSchedule(ctx, sheetURL)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) ([]*models.Day, error) {
|
||||
func (p *ScheduleParser) parseAndSaveSchedule(ctx context.Context, sheetURL string) {
|
||||
schedule, err := p.parseSchedule(ctx, sheetURL)
|
||||
if err != nil {
|
||||
log.Printf("Error parse schedule: %s\n", sheetURL)
|
||||
return
|
||||
}
|
||||
if err := p.scheduleStorage.SaveSchedule(schedule); err != nil {
|
||||
log.Printf("Error save err: %s schedule: %s\n", err, sheetURL)
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) (*models.Schedule, error) {
|
||||
var performances []performance
|
||||
if err := p.dataParser.Parse(ctx, sheetURL, &performances); err != nil {
|
||||
return nil, err
|
||||
@@ -70,7 +75,7 @@ func (p *ScheduleParser) parseSchedule(ctx context.Context, sheetURL string) ([]
|
||||
return p.mapSchedule(performances), nil
|
||||
}
|
||||
|
||||
func (p *ScheduleParser) mapSchedule(performances []performance) []*models.Day {
|
||||
func (p *ScheduleParser) mapSchedule(performances []performance) *models.Schedule {
|
||||
days := []*models.Day{}
|
||||
currentDay := &models.Day{}
|
||||
for i, performance := range performances {
|
||||
@@ -101,7 +106,10 @@ func (p *ScheduleParser) mapSchedule(performances []performance) []*models.Day {
|
||||
)
|
||||
}
|
||||
days = append(days, currentDay)
|
||||
return days
|
||||
return &models.Schedule{
|
||||
UpdateTime: time.Now().String(),
|
||||
Days: days,
|
||||
}
|
||||
}
|
||||
|
||||
func (p *ScheduleParser) mapDate(date string) (time.Time, error) {
|
||||
|
||||
@@ -6,6 +6,7 @@ import (
|
||||
"log"
|
||||
"os"
|
||||
"pinned_message/internal/models"
|
||||
"strings"
|
||||
"time"
|
||||
)
|
||||
|
||||
@@ -21,36 +22,48 @@ func NewScheduleStorage(
|
||||
}
|
||||
}
|
||||
|
||||
func (s *ScheduleStorage) SaveSchedule(days []*models.Day) error {
|
||||
data, err := json.Marshal(days)
|
||||
func (s *ScheduleStorage) SaveSchedule(schedule *models.Schedule) error {
|
||||
data, err := json.Marshal(schedule)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
if err := os.WriteFile(s.filepath, data, 0644); err != nil {
|
||||
return err
|
||||
}
|
||||
log.Printf("save story to: %s", s.filepath)
|
||||
log.Printf("save schedule to: %s", s.filepath)
|
||||
return nil
|
||||
}
|
||||
|
||||
func (s *ScheduleStorage) GetSchedule() ([]*models.Day, error) {
|
||||
func (s *ScheduleStorage) GetSchedule() (*models.Schedule, error) {
|
||||
data, err := os.ReadFile(s.filepath)
|
||||
if err != nil {
|
||||
return nil, fmt.Errorf("story file %s not found", s.filepath)
|
||||
return nil, fmt.Errorf("schedule file %s not found", s.filepath)
|
||||
}
|
||||
log.Printf("load story from: %s", s.filepath)
|
||||
days := []*models.Day{}
|
||||
if err := json.Unmarshal(data, &days); err != nil {
|
||||
log.Printf("load schedule from: %s", s.filepath)
|
||||
schedule := &models.Schedule{}
|
||||
if err := json.Unmarshal(data, &schedule); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
filterDays := make([]*models.Day, 0, len(days))
|
||||
for _, day := range days {
|
||||
filterDays := make([]*models.Day, 0, len(schedule.Days))
|
||||
for _, day := range schedule.Days {
|
||||
if isBeforeToday(day.Date) {
|
||||
continue
|
||||
}
|
||||
for i := range day.Performances {
|
||||
filterNumbers := make([]*models.Number, 0, len(day.Performances[i].Numbers))
|
||||
for _, number := range day.Performances[i].Numbers {
|
||||
name := strings.TrimSpace(number.Name)
|
||||
if name == "" || name == "-" {
|
||||
continue
|
||||
}
|
||||
filterNumbers = append(filterNumbers, number)
|
||||
}
|
||||
day.Performances[i].Numbers = filterNumbers
|
||||
}
|
||||
filterDays = append(filterDays, day)
|
||||
}
|
||||
return filterDays, nil
|
||||
schedule.Days = filterDays
|
||||
return schedule, nil
|
||||
}
|
||||
|
||||
func isBeforeToday(targetDate time.Time) bool {
|
||||
|
||||
@@ -21,15 +21,17 @@ func NewServices(
|
||||
}
|
||||
}
|
||||
|
||||
func (s *Services) GetDays(context.Context, *proto.GetDaysReq) (*proto.GetDaysRsp, error) {
|
||||
days, err := s.scheduleStorage.GetSchedule()
|
||||
func (s *Services) GetSchedule(context.Context, *proto.GetScheduleReq) (*proto.GetScheduleRsp, error) {
|
||||
schedule, err := s.scheduleStorage.GetSchedule()
|
||||
if err != nil {
|
||||
return nil, status.Errorf(codes.Internal, err.Error())
|
||||
}
|
||||
|
||||
res := &proto.GetDaysRsp{}
|
||||
for _, day := range days {
|
||||
res := &proto.GetScheduleRsp{
|
||||
UpdateTime: schedule.UpdateTime,
|
||||
}
|
||||
|
||||
for _, day := range schedule.Days {
|
||||
resPerformances := make([]*proto.Performance, 0, len(day.Performances))
|
||||
for _, performance := range day.Performances {
|
||||
resNumbers := make([]*proto.Number, 0, len(performance.Numbers))
|
||||
|
||||
Reference in New Issue
Block a user