Skip to content

Commit

Permalink
Statistics endpoint (#101)
Browse files Browse the repository at this point in the history
* add ammunition statistics

* move struct members

* add tests
  • Loading branch information
morphy2k committed Feb 11, 2022
1 parent 071d622 commit 985ab7f
Show file tree
Hide file tree
Showing 8 changed files with 1,226 additions and 8 deletions.
87 changes: 79 additions & 8 deletions controller/controller_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import (
"github.com/tarkov-database/rest-api/model/location"
"github.com/tarkov-database/rest-api/model/location/feature"
"github.com/tarkov-database/rest-api/model/location/featuregroup"
"github.com/tarkov-database/rest-api/model/statistic/ammunition/armor"
"github.com/tarkov-database/rest-api/model/user"

"github.com/google/logger"
Expand All @@ -26,13 +27,14 @@ import (
const contentTypeJSON = "application/json"

var (
itemIDs []primitive.ObjectID
userIDs []primitive.ObjectID
moduleIDs []primitive.ObjectID
productionIDs []primitive.ObjectID
locationIDs []primitive.ObjectID
featureIDs []primitive.ObjectID
featureGroupIDs []primitive.ObjectID
itemIDs []primitive.ObjectID
userIDs []primitive.ObjectID
moduleIDs []primitive.ObjectID
productionIDs []primitive.ObjectID
locationIDs []primitive.ObjectID
featureIDs []primitive.ObjectID
featureGroupIDs []primitive.ObjectID
ammoArmorStatsIDs []primitive.ObjectID
)

func init() {
Expand All @@ -50,6 +52,7 @@ func mongoStartup() {
createProductions()
createLocations()
createFeatureGroups()
createStatisticAmmoArmor()
createFeatures()
}

Expand All @@ -60,6 +63,7 @@ func mongoCleanup() {
removeLocations()
removeFeatures()
removeFeatureGroups()
removeStatisticAmmoArmor()
removeUsers()

if err := database.Shutdown(); err != nil {
Expand Down Expand Up @@ -175,6 +179,24 @@ func removeFeatureGroupID(id primitive.ObjectID) {
featureGroupIDs = new
}

func createStatisticAmmoArmorID() primitive.ObjectID {
id := primitive.NewObjectID()
ammoArmorStatsIDs = append(ammoArmorStatsIDs, id)

return id
}

func removeStatisticAmmoArmorID(id primitive.ObjectID) {
new := make([]primitive.ObjectID, 0, len(ammoArmorStatsIDs)-1)
for _, k := range ammoArmorStatsIDs {
if k != id {
new = append(new, k)
}
}

ammoArmorStatsIDs = new
}

func createUserID() primitive.ObjectID {
id := primitive.NewObjectID()
userIDs = append(userIDs, id)
Expand Down Expand Up @@ -287,7 +309,7 @@ func removeProductions() {
ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
defer cancel()

if _, err := c.DeleteMany(ctx, bson.M{"_id": bson.M{"$in": moduleIDs}}); err != nil {
if _, err := c.DeleteMany(ctx, bson.M{"_id": bson.M{"$in": productionIDs}}); err != nil {
log.Fatalf("Database cleanup error: %s", err)
}
}
Expand Down Expand Up @@ -419,6 +441,55 @@ func removeFeatureGroups() {
}
}

func createStatisticAmmoArmor() {
c := database.GetDB().Collection(armor.Collection)

ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
defer cancel()

statsA := armor.AmmoArmorStatistics{
ID: createStatisticAmmoArmorID(),
Ammo: primitive.NewObjectID(),
Armor: armor.ItemRef{
ID: primitive.NewObjectID(),
Kind: item.KindTacticalrig,
},
Distance: 100,
PenetrationChance: [4]float64{},
AverageShotsToDestruction: armor.Statistics{},
AverageShotsTo50Damage: armor.Statistics{},
Modified: model.Timestamp{Time: time.Now()},
}
statsB := armor.AmmoArmorStatistics{
ID: createStatisticAmmoArmorID(),
Ammo: primitive.NewObjectID(),
Armor: armor.ItemRef{
ID: primitive.NewObjectID(),
Kind: item.KindArmor,
},
Distance: 500,
PenetrationChance: [4]float64{},
AverageShotsToDestruction: armor.Statistics{},
AverageShotsTo50Damage: armor.Statistics{},
Modified: model.Timestamp{Time: time.Now()},
}

if _, err := c.InsertMany(ctx, bson.A{statsA, statsB}); err != nil {
log.Fatalf("Database startup error: %s", err)
}
}

func removeStatisticAmmoArmor() {
c := database.GetDB().Collection(armor.Collection)

ctx, cancel := context.WithTimeout(context.Background(), 12*time.Second)
defer cancel()

if _, err := c.DeleteMany(ctx, bson.M{"_id": bson.M{"$in": ammoArmorStatsIDs}}); err != nil {
log.Fatalf("Database cleanup error: %s", err)
}
}

func createUsers() {
c := database.GetDB().Collection(user.Collection)

Expand Down
20 changes: 20 additions & 0 deletions controller/helper.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,8 +2,10 @@ package controller

import (
"encoding/json"
"fmt"
"io"
"net/http"
"net/url"
"regexp"
"strconv"
"strings"
Expand Down Expand Up @@ -85,3 +87,21 @@ func parseJSONBody(body io.ReadCloser, target interface{}) error {
defer body.Close()
return json.NewDecoder(body).Decode(target)
}

func parseObjIDs(query string) ([]string, error) {
q, err := url.QueryUnescape(query)
if err != nil {
return nil, fmt.Errorf("Query string error: %s", err)
}

if len(q) < 24 {
return nil, fmt.Errorf("ID is not valid")
}

ids := strings.Split(q, ",")
if len(ids) > 100 {
return nil, fmt.Errorf("ID limit exceeded")
}

return ids, nil
}
Loading

0 comments on commit 985ab7f

Please sign in to comment.