90 lines
2.1 KiB
Go
90 lines
2.1 KiB
Go
package timespan
|
|
|
|
import (
|
|
"fmt"
|
|
"time"
|
|
|
|
"github.com/traggo/server/generated/gqlmodel"
|
|
"github.com/traggo/server/model"
|
|
)
|
|
|
|
func timespanToInternal(userID int, start model.Time, end *model.Time, tags []*gqlmodel.InputTimeSpanTag, note string) (model.TimeSpan, error) {
|
|
_, offset := start.Time().Zone()
|
|
span := model.TimeSpan{
|
|
StartUserTime: start.OmitTimeZone(),
|
|
StartUTC: start.UTC(),
|
|
UserID: userID,
|
|
Tags: tagsToInternal(tags),
|
|
OffsetUTC: offset,
|
|
Note: note,
|
|
}
|
|
|
|
if end != nil {
|
|
if start.Time().After(end.Time()) {
|
|
return span, fmt.Errorf("start must be before end")
|
|
}
|
|
endUser := end.OmitTimeZone()
|
|
span.EndUserTime = &endUser
|
|
endUTC := end.UTC()
|
|
span.EndUTC = &endUTC
|
|
}
|
|
|
|
return span, nil
|
|
}
|
|
|
|
func timeSpanToExternal(span model.TimeSpan) *gqlmodel.TimeSpan {
|
|
location := time.FixedZone("unknown", span.OffsetUTC)
|
|
|
|
result := gqlmodel.TimeSpan{
|
|
Start: model.Time(span.StartUTC.In(location)),
|
|
End: nil,
|
|
ID: span.ID,
|
|
Tags: tagsToExternal(span.Tags),
|
|
Note: span.Note,
|
|
}
|
|
if span.EndUTC != nil && !span.EndUTC.IsZero() {
|
|
end := *span.EndUTC
|
|
endModel := model.Time(end.In(location))
|
|
result.End = &endModel
|
|
}
|
|
|
|
return &result
|
|
}
|
|
|
|
func tagsToExternal(tags []model.TimeSpanTag) []*gqlmodel.TimeSpanTag {
|
|
result := []*gqlmodel.TimeSpanTag{}
|
|
for _, tag := range tags {
|
|
result = append(result, &gqlmodel.TimeSpanTag{
|
|
Key: tag.Key,
|
|
Value: tag.StringValue,
|
|
})
|
|
}
|
|
return result
|
|
}
|
|
|
|
func tagsToInternal(gqls []*gqlmodel.InputTimeSpanTag) []model.TimeSpanTag {
|
|
result := make([]model.TimeSpanTag, 0)
|
|
for _, tag := range gqls {
|
|
result = append(result, tagToInternal(*tag))
|
|
}
|
|
return result
|
|
}
|
|
|
|
func tagToInternal(gqls gqlmodel.InputTimeSpanTag) model.TimeSpanTag {
|
|
return model.TimeSpanTag{
|
|
Key: gqls.Key,
|
|
StringValue: gqls.Value,
|
|
}
|
|
}
|
|
|
|
func tagsToInputTag(tags []model.TimeSpanTag) []*gqlmodel.InputTimeSpanTag {
|
|
result := make([]*gqlmodel.InputTimeSpanTag, 0)
|
|
for _, tag := range tags {
|
|
result = append(result, &gqlmodel.InputTimeSpanTag{
|
|
Key: tag.Key,
|
|
Value: tag.StringValue,
|
|
})
|
|
}
|
|
return result
|
|
}
|