Skip to content

Commit 96f477d

Browse files
committed
feat: functionality for routes and mongo/factory service and creation of strategy
1 parent 6dc31c5 commit 96f477d

File tree

13 files changed

+322
-12
lines changed

13 files changed

+322
-12
lines changed

README.md

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1 +1,8 @@
1-
# mercury
1+
# Mercury (Trading Strategy Management System)
2+
3+
This system is designed to manage, monitor, and measure trading strategies by providing tools for health checks, logging, and operational control, such as pausing or resuming strategies. It integrates a data pipeline that allows strategies to access both internal and external data sources seamlessly. By acting as a centralized interface, it enables independent operation, making it a versatile component for any trading platform.
4+
5+
### This is not a risk management system. Please refer to [vital-risk-engine](https://github.com/syntaxsdev/vital-risk-engine)
6+
This manages the underlying strategies running code themselves into one platform.
7+
8+

cmd/mercury/main.go

Lines changed: 0 additions & 11 deletions
This file was deleted.

go.mod

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,5 +6,19 @@ require (
66
github.com/cespare/xxhash/v2 v2.2.0 // indirect
77
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
88
github.com/go-chi/chi/v5 v5.2.0 // indirect
9+
github.com/golang-migrate/migrate/v4 v4.18.1 // indirect
10+
github.com/golang/snappy v0.0.4 // indirect
11+
github.com/hashicorp/errwrap v1.1.0 // indirect
12+
github.com/hashicorp/go-multierror v1.1.1 // indirect
13+
github.com/klauspost/compress v1.17.11 // indirect
914
github.com/redis/go-redis/v9 v9.7.0 // indirect
15+
github.com/xdg-go/pbkdf2 v1.0.0 // indirect
16+
github.com/xdg-go/scram v1.1.2 // indirect
17+
github.com/xdg-go/stringprep v1.0.4 // indirect
18+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 // indirect
19+
go.mongodb.org/mongo-driver/v2 v2.0.0 // indirect
20+
go.uber.org/atomic v1.11.0 // indirect
21+
golang.org/x/crypto v0.31.0 // indirect
22+
golang.org/x/sync v0.10.0 // indirect
23+
golang.org/x/text v0.21.0 // indirect
1024
)

go.sum

Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,63 @@
11
github.com/cespare/xxhash/v2 v2.2.0 h1:DC2CZ1Ep5Y4k3ZQ899DldepgrayRUGE6BBZ/cd9Cj44=
22
github.com/cespare/xxhash/v2 v2.2.0/go.mod h1:VGX0DQ3Q6kWi7AoAeZDth3/j3BFtOZR5XLFGgcrjCOs=
3+
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
34
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78=
45
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc=
56
github.com/go-chi/chi/v5 v5.2.0 h1:Aj1EtB0qR2Rdo2dG4O94RIU35w2lvQSj6BRA4+qwFL0=
67
github.com/go-chi/chi/v5 v5.2.0/go.mod h1:DslCQbL2OYiznFReuXYUmQ2hGd1aDpCnlMNITLSKoi8=
8+
github.com/golang-migrate/migrate/v4 v4.18.1 h1:JML/k+t4tpHCpQTCAD62Nu43NUFzHY4CV3uAuvHGC+Y=
9+
github.com/golang-migrate/migrate/v4 v4.18.1/go.mod h1:HAX6m3sQgcdO81tdjn5exv20+3Kb13cmGli1hrD6hks=
10+
github.com/golang/snappy v0.0.4 h1:yAGX7huGHXlcLOEtBnF4w7FQwA26wojNCwOYAEhLjQM=
11+
github.com/golang/snappy v0.0.4/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q=
12+
github.com/hashicorp/errwrap v1.0.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
13+
github.com/hashicorp/errwrap v1.1.0 h1:OxrOeh75EUXMY8TBjag2fzXGZ40LB6IKw45YeGUDY2I=
14+
github.com/hashicorp/errwrap v1.1.0/go.mod h1:YH+1FKiLXxHSkmPseP+kNlulaMuP3n2brvKWEqk/Jc4=
15+
github.com/hashicorp/go-multierror v1.1.1 h1:H5DkEtf6CXdFp0N0Em5UCwQpXMWke8IA0+lD48awMYo=
16+
github.com/hashicorp/go-multierror v1.1.1/go.mod h1:iw975J/qwKPdAO1clOe2L8331t/9/fmwbPZ6JB6eMoM=
17+
github.com/klauspost/compress v1.17.11 h1:In6xLpyWOi1+C7tXUUWv2ot1QvBjxevKAaI6IXrJmUc=
18+
github.com/klauspost/compress v1.17.11/go.mod h1:pMDklpSncoRMuLFrf1W9Ss9KT+0rH90U12bZKk7uwG0=
19+
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
720
github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E=
821
github.com/redis/go-redis/v9 v9.7.0/go.mod h1:f6zhXITC7JUJIlPEiBOTXxJgPLdZcA93GewI7inzyWw=
22+
github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c=
23+
github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI=
24+
github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY=
25+
github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4=
26+
github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8=
27+
github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM=
28+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM=
29+
github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI=
30+
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
31+
go.mongodb.org/mongo-driver/v2 v2.0.0 h1:Jfd7XpdZa9yk3eY774bO7SWVb30noLSirL9nKTpavhI=
32+
go.mongodb.org/mongo-driver/v2 v2.0.0/go.mod h1:nSjmNq4JUstE8IRZKTktLgMHM4F1fccL6HGX1yh+8RA=
33+
go.uber.org/atomic v1.11.0 h1:ZvwS0R+56ePWxUNi+Atn9dWONBPp/AUETXlHW0DxSjE=
34+
go.uber.org/atomic v1.11.0/go.mod h1:LUxbIzbOniOlMKjJjyPfpl4v+PKK2cNJn91OQbhoJI0=
35+
golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w=
36+
golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc=
37+
golang.org/x/crypto v0.31.0 h1:ihbySMvVjLAeSH1IbfcRTkD/iNscyz8rGzjF/E5hV6U=
38+
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
39+
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=
40+
golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s=
41+
golang.org/x/net v0.0.0-20210226172049-e18ecbb05110/go.mod h1:m0MpNAwzfU5UDzcl9v0D8zg8gWTRqZa9RBIspLL5mdg=
42+
golang.org/x/net v0.0.0-20220722155237-a158d28d115b/go.mod h1:XRhObCWvk6IyKnWLug+ECip1KBveYUHfp+8e9klMJ9c=
43+
golang.org/x/sync v0.0.0-20190423024810-112230192c58/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
44+
golang.org/x/sync v0.0.0-20220722155255-886fb9371eb4/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM=
45+
golang.org/x/sync v0.10.0 h1:3NQrjDixjgGwUOCaF8w2+VYHv0Ve/vGYSbdkTa98gmQ=
46+
golang.org/x/sync v0.10.0/go.mod h1:Czt+wKu1gCyEFDUtn0jG5QVvpJ6rzVqr5aXyt9drQfk=
47+
golang.org/x/sys v0.0.0-20190215142949-d0b11bdaac8a/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
48+
golang.org/x/sys v0.0.0-20201119102817-f84b799fce68/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
49+
golang.org/x/sys v0.0.0-20210615035016-665e8c7367d1/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
50+
golang.org/x/sys v0.0.0-20220520151302-bc2c85ada10a/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
51+
golang.org/x/sys v0.0.0-20220722155257-8c9f86f7a55f/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
52+
golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo=
53+
golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8=
54+
golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ=
55+
golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ=
56+
golang.org/x/text v0.3.7/go.mod h1:u+2+/6zg+i71rQMx5EYifcz6MCKuco9NR6JIITiCfzQ=
57+
golang.org/x/text v0.3.8/go.mod h1:E6s5w1FMmriuDzIBO73fBruAKo1PCIq6d2Q6DHfQ8WQ=
58+
golang.org/x/text v0.21.0 h1:zyQAAkrwaneQ066sspRyJaG9VNi/YJ1NfzcGB3hZ/qo=
59+
golang.org/x/text v0.21.0/go.mod h1:4IBbMaMmOPCJ8SecivzSH54+73PCFmPWxNTLm+vZkEQ=
60+
golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
61+
golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo=
62+
golang.org/x/tools v0.1.12/go.mod h1:hNGJHUnrk76NpqgfD5Aqm5Crs+Hm0VOH/i9J2+nxYbc=
63+
golang.org/x/xerrors v0.0.0-20190717185122-a985d3407aa7/go.mod h1:I/5z698sn9Ka8TeJc9MKroUUfqBBauWjQqLJ2OPfmY0=

internal/api/routes.go

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/go-chi/chi/v5"
7+
"github.com/syntaxsdev/mercury/internal/services"
8+
)
9+
10+
func InitRoutes(factory *services.Factory) http.Handler {
11+
r := chi.NewRouter()
12+
13+
r.Route("/strategy", func(r chi.Router) {
14+
StrategyRoutes(r, factory)
15+
})
16+
return r
17+
}

internal/api/strategy.go

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,19 @@
1+
package api
2+
3+
import (
4+
"net/http"
5+
6+
"github.com/go-chi/chi/v5"
7+
"github.com/syntaxsdev/mercury/internal/handlers"
8+
"github.com/syntaxsdev/mercury/internal/services"
9+
)
10+
11+
func StrategyRoutes(r chi.Router, factory *services.Factory) {
12+
r.Get("/", func(w http.ResponseWriter, r *http.Request) {
13+
handlers.GetAllStrategies(w, r, factory)
14+
})
15+
16+
r.Post("/", func(w http.ResponseWriter, r *http.Request) {
17+
handlers.CreateStrategy(w, r, factory)
18+
})
19+
}

internal/handlers/strategy.go

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
package handlers
2+
3+
import (
4+
"encoding/json"
5+
"net/http"
6+
7+
"github.com/syntaxsdev/mercury/internal/services"
8+
"github.com/syntaxsdev/mercury/models"
9+
)
10+
11+
// Get All Strategies
12+
func GetAllStrategies(w http.ResponseWriter, r *http.Request, f *services.Factory) {
13+
14+
}
15+
16+
// Create A Strategy
17+
func CreateStrategy(w http.ResponseWriter, r *http.Request, f *services.Factory) {
18+
var newStrategy models.Strategy
19+
if err := json.NewDecoder(r.Body).Decode(&newStrategy); err != nil {
20+
21+
}
22+
f.MongoService.Insert("strategies", newStrategy)
23+
}

internal/repositories/mongo.go

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,37 @@
1+
package repositories
2+
3+
import (
4+
"context"
5+
"log"
6+
"time"
7+
8+
"go.mongodb.org/mongo-driver/v2/mongo"
9+
"go.mongodb.org/mongo-driver/v2/mongo/options"
10+
"go.mongodb.org/mongo-driver/v2/mongo/readpref"
11+
)
12+
13+
func NewMongoClient(connection string) (*mongo.Client, func()) {
14+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
15+
16+
client, err := mongo.Connect(options.Client().ApplyURI(connection))
17+
if err != nil {
18+
cancel()
19+
log.Fatalf("Failed to connect to MongoDB client: %v", err)
20+
}
21+
22+
if err := client.Ping(ctx, readpref.Primary()); err != nil {
23+
cancel()
24+
log.Fatalf("Failed to connect to MongoDB client: %v", err)
25+
}
26+
27+
cleanup := func() {
28+
cancel()
29+
if err := client.Disconnect(context.Background()); err != nil {
30+
log.Fatalf("Failed to disconnect to MongoDB client: %v", err)
31+
} else {
32+
log.Println("MongoDB disconnected successfully")
33+
}
34+
}
35+
return client, cleanup
36+
37+
}

internal/services/factory.go

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
package services
2+
3+
type Factory struct {
4+
MongoService *MongoService
5+
}

internal/services/mongo.go

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
package services
2+
3+
import (
4+
"context"
5+
"time"
6+
7+
"go.mongodb.org/mongo-driver/v2/mongo"
8+
)
9+
10+
type MongoService struct {
11+
Client *mongo.Client
12+
DatabaseName string
13+
}
14+
15+
func (s *MongoService) Insert(collection string, item interface{}) (interface{}, error) {
16+
coll := s.Client.Database(s.DatabaseName).Collection(collection)
17+
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
18+
defer cancel()
19+
20+
result, err := coll.InsertOne(ctx, item)
21+
if err != nil {
22+
return nil, err
23+
}
24+
return result.InsertedID, nil
25+
26+
}
27+
28+
func (s *MongoService) First(collection string, filter interface{}, result interface{}) error {
29+
coll := s.Client.Database(s.DatabaseName).Collection(collection)
30+
ctx, cancel := context.WithTimeout(context.Background(), 3*time.Second)
31+
defer cancel()
32+
33+
err := coll.FindOne(ctx, filter).Decode(result)
34+
return err
35+
36+
}
37+
38+
func (s *MongoService) All(collection string, filter interface{}, result *[]interface{}) error {
39+
coll := s.Client.Database(s.DatabaseName).Collection(collection)
40+
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
41+
defer cancel()
42+
43+
cursor, err := coll.Find(ctx, filter)
44+
if err != nil {
45+
return err
46+
}
47+
defer cursor.Close(ctx)
48+
49+
for cursor.Next(ctx) {
50+
var doc interface{}
51+
if err := cursor.Decode(&doc); err != nil {
52+
return err
53+
}
54+
*result = append(*result, doc)
55+
}
56+
57+
if err := cursor.Err(); err != nil {
58+
return err
59+
60+
}
61+
return nil
62+
63+
}

0 commit comments

Comments
 (0)