Skip to content

Commit

Permalink
Merge pull request #24 from 7Cav/uniform-date
Browse files Browse the repository at this point in the history
Uniform date addition
  • Loading branch information
SyniRon authored Jan 17, 2025
2 parents 4331909 + c6c3ab6 commit 1445e0b
Show file tree
Hide file tree
Showing 10 changed files with 1,032 additions and 372 deletions.
3 changes: 2 additions & 1 deletion datastores/datastore.go
Original file line number Diff line number Diff line change
Expand Up @@ -37,5 +37,6 @@ type Datastore interface {
FindLiteRosterByType(rosterType proto.RosterType) (*proto.LiteRoster, error)
FindProfileByKeycloakID(keycloakId string) (*proto.Profile, error)
FindProfileByDiscordID(discordId string) (*proto.Profile, error)
FindProfilesByPosition(positionQuery string) ([]*proto.LiteProfile, error)
FindProfilesByPosition(positionQuery string) (*proto.LiteRoster, error)
FindS1UniformsRosterByType(rosterType proto.RosterType) (*proto.S1UniformsRoster, error)
}
111 changes: 107 additions & 4 deletions datastores/mysql.go
Original file line number Diff line number Diff line change
Expand Up @@ -320,7 +320,7 @@ func (ds Mysql) generateLiteProtoProfile(profile milpacs.Profile) (*proto.LitePr
return milpac, nil
}

func (ds Mysql) FindProfilesByPosition(positionQuery string) ([]*proto.LiteProfile, error) {
func (ds Mysql) FindProfilesByPosition(positionQuery string) (*proto.LiteRoster, error) {
var profiles []milpacs.Profile

Info.Printf("Searching for profiles with position matching: %s", positionQuery)
Expand All @@ -341,14 +341,117 @@ func (ds Mysql) FindProfilesByPosition(positionQuery string) ([]*proto.LiteProfi
return nil, result.Error
}

var protoProfiles []*proto.LiteProfile
var profileMap = make(map[uint64]*proto.LiteProfile, len(profiles))
for _, profile := range profiles {
protoProfile, err := ds.generateLiteProtoProfile(profile)
if err != nil {
return nil, fmt.Errorf("error generating lite profile: %w", err)
}
protoProfiles = append(protoProfiles, protoProfile)
profileMap[profile.RelationId] = protoProfile
}
return &proto.LiteRoster{Profiles: profileMap}, nil
}

func (ds Mysql) FindS1UniformsRosterByType(rosterType proto.RosterType) (*proto.S1UniformsRoster, error) {
var rosterProfiles []milpacs.Profile

Info.Println("Searching for S1 Uniforms roster: ", rosterType.String(), "id:", uint(rosterType.Number()))
ds.Db.Preload(clause.Associations).
Preload("AwardRecords.Award").
Joins(xenforo.ConnectedAccountJoin).
Where(map[string]interface{}{"roster_id": uint(rosterType.Number())}).
Find(&rosterProfiles)

var profiles = make(map[uint64]*proto.S1UniformsProfile, len(rosterProfiles))
for _, profile := range rosterProfiles {
milpac, err := ds.generateS1UniformsProtoProfile(profile)

if err != nil {
return nil, fmt.Errorf("error generating profile")
}
profiles[profile.RelationId] = milpac
}

protoRoster := &proto.S1UniformsRoster{Profiles: profiles}

return protoRoster, nil
}

func (ds Mysql) generateS1UniformsProtoProfile(profile milpacs.Profile) (*proto.S1UniformsProfile, error) {
milpac := &proto.S1UniformsProfile{
User: &proto.User{
UserId: profile.XfUser.UserID,
Username: profile.XfUser.Username,
},
Rank: &proto.S1UniformsRank{
RankShort: strings.TrimPrefix(proto.RankType(profile.RankID).String(), "RANK_TYPE_"),
RankFull: profile.Rank.Title,
RankImageUrl: profile.Rank.ImageURL(),
},
RealName: profile.RealName,
UniformUrl: profile.UniformUrl(),
UniformDate: getUniformDate(profile),
UniformUpdateTriggerDate: getUniformUpdateTriggerDate(profile),
Roster: proto.RosterType(profile.RosterId),
PrimaryPositionTitle: profile.Primary.PositionTitle,
Secondaries: ds.collectS1UniformsSecondaryPositions(profile.SecondaryPositionIds),
JoinDate: profile.UnmarshalCustomFields().JoinDate,
PromotionDate: profile.UnmarshalCustomFields().PromoDate,
}

return protoProfiles, nil
return milpac, nil
}

func (ds Mysql) collectS1UniformsSecondaryPositions(positionIds string) []*proto.S1UniformsPosition {
var positions []*proto.S1UniformsPosition

if positionIds == "" {
return positions
}

for _, id := range strings.Split(positionIds, ",") {
var position milpacs.Position
ds.Db.First(&position, id)
positions = append(positions, &proto.S1UniformsPosition{
PositionTitle: position.PositionTitle,
})
}
return positions
}

func getUniformDate(profile milpacs.Profile) string {
if profile.UniformDate <= 0 {
return ""
}
return time.Unix(int64(profile.UniformDate), 0).Format("2006-01-02 15:04:05")
}

func getUniformUpdateTriggerDate(profile milpacs.Profile) string {
relevantRecordTypes := map[proto.RecordType]bool{
proto.RecordType_RECORD_TYPE_PROMOTION: true,
proto.RecordType_RECORD_TYPE_TRANSFER: true,
proto.RecordType_RECORD_TYPE_ASSIGNMENT: true,
proto.RecordType_RECORD_TYPE_ELOA: true,
proto.RecordType_RECORD_TYPE_NAME_CHANGE: true,
proto.RecordType_RECORD_TYPE_GRADUATION: true,
}

var latestTimestamp int64

for _, award := range profile.AwardRecords {
if int64(award.AwardDate) > latestTimestamp {
latestTimestamp = int64(award.AwardDate)
}
}

for _, record := range profile.Records {
if relevantRecordTypes[proto.RecordType(record.RecordTypeId)] && int64(record.RecordDate) > latestTimestamp {
latestTimestamp = int64(record.RecordDate)
}
}

if latestTimestamp == 0 {
return ""
}
return time.Unix(latestTimestamp, 0).Format("2006-01-02 15:04:05")
}
59 changes: 30 additions & 29 deletions go.mod
Original file line number Diff line number Diff line change
@@ -1,47 +1,47 @@
module github.com/7cav/api

go 1.22.0
go 1.23.0

toolchain go1.23.4

require (
github.com/bufbuild/buf v1.48.0
github.com/bufbuild/buf v1.49.0
github.com/grpc-ecosystem/grpc-gateway/v2 v2.25.1
github.com/rakyll/statik v0.1.7
github.com/spf13/cobra v1.8.1
github.com/spf13/viper v1.19.0
golang.org/x/oauth2 v0.24.0
google.golang.org/genproto/googleapis/api v0.0.0-20241230172942-26aa7a208def
google.golang.org/grpc v1.69.2
golang.org/x/oauth2 v0.25.0
google.golang.org/genproto/googleapis/api v0.0.0-20250115164207-1a7da9e5054f
google.golang.org/grpc v1.69.4
google.golang.org/grpc/cmd/protoc-gen-go-grpc v1.5.1
google.golang.org/protobuf v1.36.1
google.golang.org/protobuf v1.36.3
gorm.io/driver/mysql v1.5.7
gorm.io/gorm v1.25.12
)

require (
buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.1-20241031151143-70f632351282.1 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.1-20241127180247-a33202765966.1 // indirect
buf.build/gen/go/bufbuild/registry/connectrpc/go v1.17.0-20241227185654-946b6dd39b27.1 // indirect
buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.1-20241227185654-946b6dd39b27.1 // indirect
buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.1-20241007202033-cf42259fcbfc.1 // indirect
buf.build/gen/go/bufbuild/bufplugin/protocolbuffers/go v1.36.3-20241031151143-70f632351282.1 // indirect
buf.build/gen/go/bufbuild/protovalidate/protocolbuffers/go v1.36.3-20241127180247-a33202765966.1 // indirect
buf.build/gen/go/bufbuild/registry/connectrpc/go v1.18.1-20250106231242-56271afbd6ce.1 // indirect
buf.build/gen/go/bufbuild/registry/protocolbuffers/go v1.36.3-20250106231242-56271afbd6ce.1 // indirect
buf.build/gen/go/pluginrpc/pluginrpc/protocolbuffers/go v1.36.3-20241007202033-cf42259fcbfc.1 // indirect
buf.build/go/bufplugin v0.6.0 // indirect
buf.build/go/protoyaml v0.3.1 // indirect
buf.build/go/spdx v0.2.0 // indirect
cel.dev/expr v0.19.1 // indirect
cloud.google.com/go/compute/metadata v0.6.0 // indirect
connectrpc.com/connect v1.17.0 // indirect
connectrpc.com/connect v1.18.1 // indirect
connectrpc.com/otelconnect v0.7.1 // indirect
filippo.io/edwards25519 v1.1.0 // indirect
github.com/Azure/go-ansiterm v0.0.0-20230124172434-306776ec8161 // indirect
github.com/Azure/go-ansiterm v0.0.0-20250102033503-faa5f7b0171c // indirect
github.com/Microsoft/go-winio v0.6.2 // indirect
github.com/Microsoft/hcsshim v0.12.9 // indirect
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
github.com/bufbuild/protocompile v0.14.1 // indirect
github.com/bufbuild/protoplugin v0.0.0-20240911180120-7bb73e41a54a // indirect
github.com/bufbuild/protoplugin v0.0.0-20250106231243-3a819552c9d9 // indirect
github.com/bufbuild/protovalidate-go v0.8.2 // indirect
github.com/containerd/cgroups/v3 v3.0.5 // indirect
github.com/containerd/containerd v1.7.24 // indirect
github.com/containerd/containerd v1.7.25 // indirect
github.com/containerd/continuity v0.4.5 // indirect
github.com/containerd/errdefs v1.0.0 // indirect
github.com/containerd/errdefs/pkg v0.3.0 // indirect
Expand All @@ -52,9 +52,9 @@ require (
github.com/containerd/typeurl/v2 v2.2.3 // indirect
github.com/cpuguy83/go-md2man/v2 v2.0.6 // indirect
github.com/distribution/reference v0.6.0 // indirect
github.com/docker/cli v27.4.1+incompatible // indirect
github.com/docker/cli v27.5.0+incompatible // indirect
github.com/docker/distribution v2.8.3+incompatible // indirect
github.com/docker/docker v27.4.1+incompatible // indirect
github.com/docker/docker v27.5.0+incompatible // indirect
github.com/docker/docker-credential-helpers v0.8.2 // indirect
github.com/docker/go-connections v0.5.0 // indirect
github.com/docker/go-units v0.5.0 // indirect
Expand All @@ -70,7 +70,7 @@ require (
github.com/gogo/protobuf v1.3.2 // indirect
github.com/golang/groupcache v0.0.0-20241129210726-2c02b8208cf8 // indirect
github.com/google/cel-go v0.22.1 // indirect
github.com/google/go-containerregistry v0.20.2 // indirect
github.com/google/go-containerregistry v0.20.3 // indirect
github.com/google/pprof v0.0.0-20241210010833-40e02aabc2ad // indirect
github.com/google/uuid v1.6.0 // indirect
github.com/hashicorp/hcl v1.0.0 // indirect
Expand All @@ -89,10 +89,11 @@ require (
github.com/moby/patternmatcher v0.6.0 // indirect
github.com/moby/sys/mount v0.3.4 // indirect
github.com/moby/sys/mountinfo v0.7.2 // indirect
github.com/moby/sys/reexec v0.1.0 // indirect
github.com/moby/sys/sequential v0.6.0 // indirect
github.com/moby/sys/user v0.3.0 // indirect
github.com/moby/sys/userns v0.1.0 // indirect
github.com/moby/term v0.5.0 // indirect
github.com/moby/term v0.5.2 // indirect
github.com/morikuni/aec v1.0.0 // indirect
github.com/onsi/ginkgo/v2 v2.22.2 // indirect
github.com/opencontainers/go-digest v1.0.0 // indirect
Expand All @@ -106,13 +107,13 @@ require (
github.com/quic-go/quic-go v0.48.2 // indirect
github.com/rs/cors v1.11.1 // indirect
github.com/russross/blackfriday/v2 v2.1.0 // indirect
github.com/sagikazarmark/locafero v0.6.0 // indirect
github.com/sagikazarmark/locafero v0.7.0 // indirect
github.com/sagikazarmark/slog-shim v0.1.0 // indirect
github.com/segmentio/asm v1.2.0 // indirect
github.com/segmentio/encoding v0.4.1 // indirect
github.com/sirupsen/logrus v1.9.3 // indirect
github.com/sourcegraph/conc v0.3.0 // indirect
github.com/spf13/afero v1.11.0 // indirect
github.com/spf13/afero v1.12.0 // indirect
github.com/spf13/cast v1.7.1 // indirect
github.com/spf13/pflag v1.0.5 // indirect
github.com/stoewer/go-strcase v1.3.0 // indirect
Expand All @@ -135,17 +136,17 @@ require (
go.uber.org/multierr v1.11.0 // indirect
go.uber.org/zap v1.27.0 // indirect
go.uber.org/zap/exp v0.3.0 // indirect
golang.org/x/crypto v0.31.0 // indirect
golang.org/x/exp v0.0.0-20241217172543-b2144cdd0a67 // indirect
golang.org/x/crypto v0.32.0 // indirect
golang.org/x/exp v0.0.0-20250106191152-7588d65b2ba8 // indirect
golang.org/x/mod v0.22.0 // indirect
golang.org/x/net v0.33.0 // indirect
golang.org/x/net v0.34.0 // indirect
golang.org/x/sync v0.10.0 // indirect
golang.org/x/sys v0.28.0 // indirect
golang.org/x/term v0.27.0 // indirect
golang.org/x/sys v0.29.0 // indirect
golang.org/x/term v0.28.0 // indirect
golang.org/x/text v0.21.0 // indirect
golang.org/x/time v0.8.0 // indirect
golang.org/x/tools v0.28.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20241230172942-26aa7a208def // indirect
golang.org/x/time v0.9.0 // indirect
golang.org/x/tools v0.29.0 // indirect
google.golang.org/genproto/googleapis/rpc v0.0.0-20250115164207-1a7da9e5054f // indirect
gopkg.in/ini.v1 v1.67.0 // indirect
gopkg.in/yaml.v3 v3.0.1 // indirect
gotest.tools/v3 v3.5.1 // indirect
Expand Down
Loading

0 comments on commit 1445e0b

Please sign in to comment.