diff --git a/go.sum b/go.sum index 8cc224e..51c5bac 100644 --- a/go.sum +++ b/go.sum @@ -13,16 +13,12 @@ cloud.google.com/go/firestore v1.17.0 h1:iEd1LBbkDZTFsLw3sTH50eyg4qe8eoG6CjocmEX cloud.google.com/go/firestore v1.17.0/go.mod h1:69uPx1papBsY8ZETooc71fOhoKkD70Q1DwMrtKuOT/Y= cloud.google.com/go/iam v1.3.0 h1:4Wo2qTaGKFtajbLpF6I4mywg900u3TLlHDb6mriLDPU= cloud.google.com/go/iam v1.3.0/go.mod h1:0Ys8ccaZHdI1dEUilwzqng/6ps2YB6vRsjIe00/+6JY= -cloud.google.com/go/logging v1.12.0 h1:ex1igYcGFd4S/RZWOCU51StlIEuey5bjqwH9ZYjHibk= -cloud.google.com/go/logging v1.12.0/go.mod h1:wwYBt5HlYP1InnrtYI0wtwttpVU1rifnMT7RejksUAM= cloud.google.com/go/longrunning v0.6.3 h1:A2q2vuyXysRcwzqDpMMLSI6mb6o39miS52UEG/Rd2ng= cloud.google.com/go/longrunning v0.6.3/go.mod h1:k/vIs83RN4bE3YCswdXC5PFfWVILjm3hpEUlSko4PiI= cloud.google.com/go/monitoring v1.22.0 h1:mQ0040B7dpuRq1+4YiQD43M2vW9HgoVxY98xhqGT+YI= cloud.google.com/go/monitoring v1.22.0/go.mod h1:hS3pXvaG8KgWTSz+dAdyzPrGUYmi2Q+WFX8g2hqVEZU= cloud.google.com/go/storage v1.48.0 h1:FhBDHACbVtdPx7S/AbcKujPWiHvfO6F8OXGgCEbB2+o= cloud.google.com/go/storage v1.48.0/go.mod h1:aFoDYNMAjv67lp+xcuZqjUKv/ctmplzQ3wJgodA7b+M= -cloud.google.com/go/trace v1.11.2 h1:4ZmaBdL8Ng/ajrgKqY5jfvzqMXbrDcBsUGXOT9aqTtI= -cloud.google.com/go/trace v1.11.2/go.mod h1:bn7OwXd4pd5rFuAnTrzBuoZ4ax2XQeG3qNgYmfCy0Io= firebase.google.com/go/v4 v4.15.1 h1:tR2dzKw1MIfCfG2bhAyxa5KQ57zcE7iFKmeYClET6ZM= firebase.google.com/go/v4 v4.15.1/go.mod h1:eunxbsh4UXI2rA8po3sOiebvWYuW0DVxAdZFO0I6wdY= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= @@ -30,18 +26,12 @@ github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0 github.com/GoogleCloudPlatform/opentelemetry-operations-go/detectors/gcp v1.25.0/go.mod h1:obipzmGjfSjam60XLwGfqUkJsfiheAl+TUjG+4yzyPM= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0 h1:o90wcURuxekmXrtxmYWTyNla0+ZEHhud6DI1ZTxd1vI= github.com/GoogleCloudPlatform/opentelemetry-operations-go/exporter/metric v0.49.0/go.mod h1:6fTWu4m3jocfUZLYF5KsZC1TUfRvEjs7lM4crme/irw= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0 h1:jJKWl98inONJAr/IZrdFQUWcwUO95DLY1XMD1ZIut+g= -github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/cloudmock v0.49.0/go.mod h1:l2fIqmwB+FKSfvn3bAD/0i+AXAxhIZjTK2svT/mgUXs= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0 h1:GYUJLfvd++4DMuMhCFLgLXvFwofIxh/qOwoGuS/LTew= github.com/GoogleCloudPlatform/opentelemetry-operations-go/internal/resourcemapping v0.49.0/go.mod h1:wRbFgBQUVm1YXrvWKofAEmq9HNJTDphbAaJSSX01KUI= github.com/MicahParks/keyfunc v1.9.0 h1:lhKd5xrFHLNOWrDc4Tyb/Q1AJ4LCzQ48GVJyVIID3+o= github.com/MicahParks/keyfunc v1.9.0/go.mod h1:IdnCilugA0O/99dW+/MkvlyrsX8+L8+x95xuVNtM5jw= github.com/andybalholm/brotli v1.1.1 h1:PR2pgnyFznKEugtsUo0xLdDop5SKXd5Qf5ysW+7XdTA= github.com/andybalholm/brotli v1.1.1/go.mod h1:05ib4cKhjx3OQYUY22hTVd34Bc8upXjOLL2rKwwZBoA= -github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= -github.com/bsm/ginkgo/v2 v2.12.0/go.mod h1:SwYbGRRDovPVboqFv0tPTcG1sN61LM1Z4ARdbAV9g4c= -github.com/bsm/gomega v1.27.10 h1:yeMWxP2pV2fG3FgAODIY8EiRE3dy0aeFYt4l7wh6yKA= -github.com/bsm/gomega v1.27.10/go.mod h1:JyEr/xRbxbtgWNi8tIEVPUYZ5Dzef52k01W3YH0H+O0= github.com/census-instrumentation/opencensus-proto v0.2.1/go.mod h1:f6KPmirojxKA12rnyqOA5BBL4O983OfeGPqjHWSTneU= github.com/census-instrumentation/opencensus-proto v0.4.1 h1:iKLQ0xPNFxR/2hzXZMrBo8f1j86j5WHzznCCQxV/b8g= github.com/census-instrumentation/opencensus-proto v0.4.1/go.mod h1:4T9NM4+4Vw91VeyqjLS6ao50K5bOcLKN6Q42XnYaRYw= @@ -52,7 +42,6 @@ github.com/cncf/udpa/go v0.0.0-20191209042840-269d4d468f6f/go.mod h1:M8M6+tZqaGX github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78 h1:QVw89YDxXxEe+l8gU8ETbOasdwEV+avkR75ZzsVV9WI= github.com/cncf/xds/go v0.0.0-20240905190251-b4127c9b8d78/go.mod h1:W+zGtBO5Y1IgJhy4+A9GOqVhqLpfZi+vwmdNXUehLA8= github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= -github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f h1:lO4WD4F/rVNCu3HqELle0jiPLLBs70cWOduZpkS1E78= github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f/go.mod h1:cuUVRXasLTGF7a8hSLbxyZXjz+1KgoB3wDUb6vlszIc= @@ -75,8 +64,6 @@ github.com/go-logr/logr v1.4.2 h1:6pFjapn8bFcIbiKo3XT4j/BhANplGihG6tvd+8rYgrY= github.com/go-logr/logr v1.4.2/go.mod h1:9T104GzyrTigFIr8wt5mBrctHMim0Nb2HLGrmQ40KvY= github.com/go-logr/stdr v1.2.2 h1:hSWxHoqTgW2S2qGc0LTAI563KZ5YKYRhT3MFKZMbjag= github.com/go-logr/stdr v1.2.2/go.mod h1:mMo/vtBO5dYbehREoey6XUKy/eSumjCCveDpRre4VKE= -github.com/go-playground/assert/v2 v2.2.0 h1:JvknZsQTYeFEAhQwI4qEt9cyV5ONwRHC+lYKSsYSR8s= -github.com/go-playground/assert/v2 v2.2.0/go.mod h1:VDjEfimB/XKnb+ZQfWdccd7VUvScMdVu0Titje2rxJ4= github.com/go-playground/locales v0.14.1 h1:EWaQ/wswjilfKLTECiXz7Rh+3BjFhfDFKv/oXslEjJA= github.com/go-playground/locales v0.14.1/go.mod h1:hxrqLVvrK65+Rwrd5Fc6F2O76J/NuW9t0sjnWqG1slY= github.com/go-playground/universal-translator v0.18.1 h1:Bcnm0ZwsGyWbCzImXv+pAJnYK9S473LQFuzCbDbfSFY= @@ -116,10 +103,6 @@ github.com/google/go-cmp v0.4.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/ github.com/google/go-cmp v0.5.0/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.3/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= github.com/google/go-cmp v0.5.5/go.mod h1:v8dTdLbMG2kIc/vJvl+f65V22dbkXbowE6jgT/gNBxE= -github.com/google/go-cmp v0.6.0 h1:ofyhxvXcZhMsU5ulbFiLKl/XBFqE1GSq7atu8tAmTRI= -github.com/google/go-cmp v0.6.0/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY= -github.com/google/martian/v3 v3.3.3 h1:DIhPTQrbPkgs2yJYdXU/eNACCG5DVQjySNRNlflZ9Fc= -github.com/google/martian/v3 v3.3.3/go.mod h1:iEPrYcgCF7jA9OtScMFQyAlZZ4YXTKEtJ1E6RWzmBA0= github.com/google/s2a-go v0.1.8 h1:zZDs9gcbt9ZPLV0ndSyQk6Kacx2g/X+SKYovpnz3SMM= github.com/google/s2a-go v0.1.8/go.mod h1:6iNWHTpQ+nfNRN5E00MSdfDwVesa8hhS32PhPO8deJA= github.com/google/uuid v1.1.2/go.mod h1:TIyPZe4MgqvfeYDBFedMoGGpEw/LqOeaOT+nhxU+yHo= @@ -148,7 +131,6 @@ github.com/montanaflynn/stats v0.7.1 h1:etflOAAHORrCC44V+aR6Ftzort912ZU+YLiSTuV8 github.com/montanaflynn/stats v0.7.1/go.mod h1:etXPPgVO6n31NxCd9KQUMvCM+ve0ruNzt6R8Bnaayow= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10 h1:GFCKgmp0tecUJ0sJuv4pzYCqS9+RGSn52M3FUwPs+uo= github.com/planetscale/vtprotobuf v0.6.1-0.20240319094008-0393e58bdf10/go.mod h1:t/avpk3KcrXxUnYOhZhMXJlSEyie6gQbtLq5NM3loB8= -github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/prometheus/client_model v0.0.0-20190812154241-14fe0d1b01d4/go.mod h1:xMI15A0UPsDsEKsMN9yxemIoYk6Tm2C1GtYGdfGttqA= github.com/redis/go-redis/v9 v9.7.0 h1:HhLSs+B6O021gwzl+locl0zEDnyNkxMtf/Z3NNBMa9E= @@ -162,8 +144,6 @@ github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpE github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg= github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU= github.com/stretchr/testify v1.8.1/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4= -github.com/stretchr/testify v1.9.0 h1:HtqpIVDClZ4nwg75+f6Lvsy/wHu+3BoSGCbBAcpTsTg= -github.com/stretchr/testify v1.9.0/go.mod h1:r2ic/lqez/lEtzL7wO/rwa5dbSLXVDPFyf8C91i36aY= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= github.com/valyala/fasthttp v1.57.0 h1:Xw8SjWGEP/+wAAgyy5XTvgrWlOD1+TxbbvNADYCm1Tg= @@ -176,7 +156,6 @@ github.com/xdg-go/scram v1.1.2 h1:FHX5I5B4i4hKRVRBCFRxq1iQRej7WO3hhBuJf+UUySY= github.com/xdg-go/scram v1.1.2/go.mod h1:RT/sEzTbU5y00aCK8UOx6R7YryM0iF1N2MOmC3kKLN4= github.com/xdg-go/stringprep v1.0.4 h1:XLI/Ng3O1Atzq0oBs3TWm+5ZVgkq2aqdlvP9JtoZ6c8= github.com/xdg-go/stringprep v1.0.4/go.mod h1:mPGuuIYwz7CmR2bT9j4GbQqutWS1zV24gijq1dTyGkM= -github.com/xyproto/randomstring v1.0.5 h1:YtlWPoRdgMu3NZtP45drfy1GKoojuR7hmRcnhZqKjWU= github.com/xyproto/randomstring v1.0.5/go.mod h1:rgmS5DeNXLivK7YprL0pY+lTuhNQW3iGxZ18UQApw/E= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78 h1:ilQV1hzziu+LLM3zUTJ0trRztfwgjqKnBWNtSRkbmwM= github.com/youmark/pkcs8 v0.0.0-20240726163527-a2c0da244d78/go.mod h1:aL8wCCfTfSfmXjznFBSZNN13rSJjlIOI1fUNAtF7rmI= @@ -193,8 +172,6 @@ go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0 h1:DheMAlT go.opentelemetry.io/contrib/instrumentation/net/http/otelhttp v0.57.0/go.mod h1:wZcGmeVO9nzP67aYSLDqXNWK87EZWhi7JWj1v7ZXf94= go.opentelemetry.io/otel v1.32.0 h1:WnBN+Xjcteh0zdk01SVqV55d/m62NJLJdIyb4y/WO5U= go.opentelemetry.io/otel v1.32.0/go.mod h1:00DCVSB0RQcnzlwyTfqtxSm+DRr9hpYrHjNGiBHVQIg= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0 h1:WDdP9acbMYjbKIyJUhTvtzj601sVJOqgWdUxSdR/Ysc= -go.opentelemetry.io/otel/exporters/stdout/stdoutmetric v1.29.0/go.mod h1:BLbf7zbNIONBLPwvFnwNHGj4zge8uTCM/UPIVW1Mq2I= go.opentelemetry.io/otel/metric v1.32.0 h1:xV2umtmNcThh2/a/aCP+h64Xx5wsj8qqnkYZktzNa0M= go.opentelemetry.io/otel/metric v1.32.0/go.mod h1:jH7CIbbK6SH2V2wE16W05BHCtIDzauciCRLoc/SyMv8= go.opentelemetry.io/otel/sdk v1.32.0 h1:RNxepc9vK59A8XsgZQouW8ue8Gkb4jpWtJm9ge5lEG4= @@ -303,7 +280,6 @@ google.golang.org/protobuf v1.35.2 h1:8Ar7bF+apOIoThw1EdZl0p1oWvMqTHmpA2fRTyZO8i google.golang.org/protobuf v1.35.2/go.mod h1:9fA7Ob0pmnwhb644+1+CVWFRbNajQ6iRojtC/QF5bRE= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= -gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM= honnef.co/go/tools v0.0.0-20190102054323-c2f93a96b099/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= honnef.co/go/tools v0.0.0-20190523083050-ea95bdfd59fc/go.mod h1:rf3lG4BRIbNafJWhAfAdb/ePZxsR/4RtNHQocxwk9r4= diff --git a/main.go b/main.go index d12eb2c..7b25be0 100644 --- a/main.go +++ b/main.go @@ -1,6 +1,8 @@ package main import ( + "encoding/json" + "fmt" "strconv" "time" @@ -39,6 +41,9 @@ func main() { Name: "Global Error Handler Function", }) } + if mappedError.LogTheDetails { + //Todo: Store The Details Of the Error With Body And Other Extra Details Like AUTH KEY AND ETC + } return c.Status(mappedError.StatusCode).JSON(mappedError) }, }) @@ -75,6 +80,9 @@ func main() { if env.Env.APP_ENV == env.APP_ENV_LOCAL || env.Env.APP_ENV == env.APP_ENV_DEVELOPE { hostAndPort = "127.0.0.1" } + // Print the router stack in JSON format + data, _ := json.MarshalIndent(app.Stack(), "", " ") + fmt.Println(string(data)) hostAndPort = hostAndPort + ":" + strconv.Itoa(env.Env.PORT) app.Listen(hostAndPort) diff --git a/src/apis/order/user/placeMarketOrder.api.go b/src/apis/order/user/placeMarketOrder.api.go new file mode 100644 index 0000000..14e355b --- /dev/null +++ b/src/apis/order/user/placeMarketOrder.api.go @@ -0,0 +1,30 @@ +package user + +import ( + "github.com/gofiber/fiber/v2" + "github.com/rpsoftech/bullion-server/src/utility" +) + +type placeMarketOrderApiBody struct { + BullionId string `json:"bullionId" validate:"required,uuid"` + UserId string `json:"userId" validate:"required,uuid"` + GroupId string `json:"groupId" validate:"required,uuid"` + Weight int `json:"weight" validate:"required,min=0"` + ProductGroupMapId string `json:"productGroupMapId" validate:"required,uuid"` + McxPrice float64 `json:"mcxPrice" validate:"required,min=0"` + Price float64 `json:"price" validate:"required,min=0"` + // ReqId float64 `json:"reqId" validate:"required,min=0"` + // @MessageBody('pgm_id') pgmid: number, + // @MessageBody('mcx') mcx: number, + // @MessageBody('price') price: number, + // @MessageBody('req_id') req_id: number, +} + +func PlaceMarkerOrderApi(c *fiber.Ctx) error { + body := new(placeMarketOrderApiBody) + c.BodyParser(body) + if err := utility.ValidateReqInput(body); err != nil { + return err + } + return nil +} diff --git a/src/interfaces/base-entity.go b/src/interfaces/base-entity.go index 7989e85..241f76f 100644 --- a/src/interfaces/base-entity.go +++ b/src/interfaces/base-entity.go @@ -43,8 +43,7 @@ func (b *BaseEntity) RestoreTimeStamp() *BaseEntity { return b } func (b *BaseEntity) createNewId() *BaseEntity { - id := uuid.New().String() - b.ID = id + b.ID = uuid.New().String() b.CreatedAt = time.Now() b.ModifiedAt = b.CreatedAt return b diff --git a/src/interfaces/req-interfaces.go b/src/interfaces/req-interfaces.go index 1936d4c..655c4e7 100644 --- a/src/interfaces/req-interfaces.go +++ b/src/interfaces/req-interfaces.go @@ -17,11 +17,12 @@ const ( ) type RequestError struct { - StatusCode int `json:"-"` - Code int `json:"code"` - Message string `json:"message"` - Name string `json:"name"` - Extra any `json:"extra,omitempty"` + StatusCode int `json:"-"` + Code int `json:"code"` + Message string `json:"message"` + Name string `json:"name"` + Extra any `json:"extra,omitempty"` + LogTheDetails bool `json:"-"` } func (r *RequestError) Error() string { diff --git a/src/interfaces/trade-user-group.entity.go b/src/interfaces/trade-user-group.entity.go index d685a85..2069e65 100644 --- a/src/interfaces/trade-user-group.entity.go +++ b/src/interfaces/trade-user-group.entity.go @@ -11,6 +11,8 @@ type ( TradeUserGroupEntity struct { *BaseEntity `bson:"inline"` *TradeUserGroupBase `bson:"inline"` + Gold *GroupPremiumBase `bson:"gold" json:"gold" validate:"required"` + Silver *GroupPremiumBase `bson:"silver" json:"silver" validate:"required"` } TradeUserGroupMapEntity struct { diff --git a/src/services/order-general.service.go b/src/services/order-general.service.go index d5535d3..6c833c9 100644 --- a/src/services/order-general.service.go +++ b/src/services/order-general.service.go @@ -44,29 +44,7 @@ func getOrderGeneralService() *orderGeneralService { return OrderGeneralService } -func (service *orderGeneralService) ValidateUserAndGroupMapWithWeight(user *interfaces.TradeUserEntity, group *interfaces.TradeUserGroupEntity, groupMap *interfaces.TradeUserGroupMapEntity, weight int) (bool, error) { - - // Check for User Activation - if !user.IsActive { - return false, &interfaces.RequestError{ - StatusCode: http.StatusUnauthorized, - Code: interfaces.ERROR_PERMISSION_NOT_ALLOWED, - Message: "Account Is Not Active Please Contact Admin", - Name: "ERROR_PERMISSION_NOT_ALLOWED", - } - } - - if flags, err := service.flagService.GetFlags(user.BullionId); err != nil { - return false, err - } else if !flags.CanTrade { - // Check If Trading Is Disabled - return false, &interfaces.RequestError{ - StatusCode: 400, - Code: interfaces.ERROR_TRADING_IS_DISABLED, - Message: "Trading is disabled. Contact User", - Name: "BULLION_NOT_ACTIVE", - } - } +func (service *orderGeneralService) ValidateUserGroupForTrade(group *interfaces.TradeUserGroupEntity) (bool, error) { // Check for Group Activation if !group.IsActive { return false, &interfaces.RequestError{ @@ -85,7 +63,10 @@ func (service *orderGeneralService) ValidateUserAndGroupMapWithWeight(user *inte Name: "GROUP_NOT_ACTIVE", } } + return true, nil +} +func (service *orderGeneralService) ValidateUserAndGroupMapWithWeight(groupMap *interfaces.TradeUserGroupMapEntity, weight int) (bool, error) { // Check for Group Map Activation if !groupMap.IsActive { return false, &interfaces.RequestError{ @@ -134,6 +115,28 @@ func (service *orderGeneralService) findOrderDetailsAndValidate(userId string, g Code: interfaces.ERROR_PERMISSION_NOT_ALLOWED, Message: "MissMatch Group Id", Name: "MISS_MATCH_GROUP_ID", + Extra: "Solution Logout And Relogin", + } + } + // Check for User Activation + if !user.IsActive { + return nil, nil, nil, &interfaces.RequestError{ + StatusCode: http.StatusUnauthorized, + Code: interfaces.ERROR_PERMISSION_NOT_ALLOWED, + Message: "Account Is Not Active Please Contact Admin", + Name: "ERROR_PERMISSION_NOT_ALLOWED", + } + } + + if flags, err := service.flagService.GetFlags(user.BullionId); err != nil { + return nil, nil, nil, err + } else if !flags.CanTrade { + // Check If Trading Is Disabled + return nil, nil, nil, &interfaces.RequestError{ + StatusCode: 400, + Code: interfaces.ERROR_TRADING_IS_DISABLED, + Message: "Trading is disabled. Contact User", + Name: "BULLION_NOT_ACTIVE", } } // Get Group @@ -141,7 +144,9 @@ func (service *orderGeneralService) findOrderDetailsAndValidate(userId string, g if err != nil { return nil, nil, nil, err } - + if valid, err := service.ValidateUserGroupForTrade(group); !valid && err != nil { + return nil, nil, nil, err + } // Get Group Map groupMaps, err := service.groupService.GetGroupMapByGroupId(groupId, user.BullionId) if err != nil { @@ -161,10 +166,14 @@ func (service *orderGeneralService) findOrderDetailsAndValidate(userId string, g Code: interfaces.ERROR_GROUP_MAP_NOT_FOUND, Message: "Group Map Not Found", Name: "GROUP_MAP_NOT_FOUND", + Extra: "Solution Logout And Relogin", } } - service.ValidateUserAndGroupMapWithWeight(user, group, groupMap, weight) + if valid, err := service.ValidateUserAndGroupMapWithWeight(groupMap, weight); !valid && err != nil { + return nil, nil, nil, err + } + return user, group, groupMap, nil } func (service *orderGeneralService) PlaceOrder(orderType interfaces.OrderStatus, userId string, groupId string, groupMapId string, buySell interfaces.BuySell, weight int, price float64, placedBy string) (*interfaces.OrderEntity, error) { @@ -179,7 +188,46 @@ func (service *orderGeneralService) PlaceOrder(orderType interfaces.OrderStatus, return nil, err } - // TODO Validate Pricing + // Validate Pricing + finalRate, err := service.calCulateAndReturnFinalRateForOrder(product, group, groupMap, buySell) + println("Final Rate", finalRate) + order := &interfaces.OrderEntity{ + BaseEntity: &interfaces.BaseEntity{}, + OrderBase: &interfaces.OrderBase{ + BullionId: group.BullionId, + OrderType: interfaces.OrderType(orderType), + BuySell: buySell, + ProductName: product.Name, + }, + LimitWatcherRequired: &interfaces.LimitWatcherRequired{ + ProductId: product.ID, + GroupId: group.ID, + ProductGroupMapId: groupMap.ID, + Volume: float64(weight), + Weight: weight, + }, + // DeliveryData: , + // Identity: , + // AfterSuccessOrder: , + } + println("Order", order) + // order.BaseEntity. + // TODO Check Hedging And Place Order + + // TODO Update Order Entity in DB + + _, err = user.UpdateMarginAfterOrder(weight, product.SourceSymbol) + if err != nil { + return nil, err + } + + // TODO Check Hedging And Place Order + return nil, nil + // return service.orderRepo.PlaceOrder(orderType, user, group, groupMap, price, placedBy) + // return service.orderRepo.PlaceOrder(orderType, user, group, groupMap, price, placedBy) +} + +func (service *orderGeneralService) calCulateAndReturnFinalRateForOrder(product *interfaces.ProductEntity, group *interfaces.TradeUserGroupEntity, groupMap *interfaces.TradeUserGroupMapEntity, buySell interfaces.BuySell) (float64, error) { priceReadKey := interfaces.PRICE_ASK if product.CalculatedOnPriceOf == interfaces.CALCULATE_ON_BID { priceReadKey = interfaces.PRICE_BID @@ -193,18 +241,21 @@ func (service *orderGeneralService) PlaceOrder(orderType interfaces.OrderStatus, productSymbol := product.SourceSymbol.ToSymbolEnum() + groupPremium := group.Gold + if product.CalcPriceMethod == interfaces.CALCULATION_PRICE_TYPE_BANK { if product.SourceSymbol == interfaces.SOURCE_SYMBOL_GOLD { productSymbol = interfaces.SYMBOL_GOLD_SPOT } else { productSymbol = interfaces.SYMBOL_SILVER_SPOT + groupPremium = group.Silver } } rate := service.liveRateService.GetLiveRate(productSymbol, priceReadKey) if rate == 0 { - return nil, &interfaces.RequestError{ + return 0, &interfaces.RequestError{ StatusCode: 400, Code: interfaces.ERROR_LIVE_RATE_NOT_FOUND, Message: "Live Rate Not Found", @@ -215,7 +266,7 @@ func (service *orderGeneralService) PlaceOrder(orderType interfaces.OrderStatus, if product.CalcPriceMethod == interfaces.CALCULATION_PRICE_TYPE_BANK { bankRate, err := service.bankRateService.GetBankRateCalcByBullionId(group.BullionId) if err != nil { - return nil, err + return 0, err } inrRate := service.liveRateService.GetLiveRate(interfaces.SYMBOL_INR, priceReadKey) calcFunc := bankRate.GOLD_SPOT.CalculatePrice @@ -225,28 +276,20 @@ func (service *orderGeneralService) PlaceOrder(orderType interfaces.OrderStatus, rate = calcFunc(rate, inrRate) // rate = bankRate.Rate } - calcSnapshot := &product.CalcSnapshot.Sell - if buySell == interfaces.Buy { - calcSnapshot = &product.CalcSnapshot.Buy - } - finalRate := interfaces.Calculate(rate, calcSnapshot) - println("Final Rate", finalRate) - // order := &interfaces.OrderEntity{ + // Extra Premium For Group + extraPremium := groupMap.Sell + groupPremium.Sell - // TODO Check Hedging And Place Order - - // TODO Update Order Entity in DB + calcSnapshot := &product.CalcSnapshot.Sell - _, err = user.UpdateMarginAfterOrder(weight, product.SourceSymbol) - if err != nil { - return nil, err + if buySell == interfaces.Buy { + calcSnapshot = &product.CalcSnapshot.Buy + extraPremium = groupMap.Buy + groupPremium.Buy } - // TODO Check Hedging And Place Order - return nil, nil - // return service.orderRepo.PlaceOrder(orderType, user, group, groupMap, price, placedBy) - // return service.orderRepo.PlaceOrder(orderType, user, group, groupMap, price, placedBy) + finalRate := interfaces.Calculate(rate+extraPremium, calcSnapshot) + return finalRate, nil + // return service.orderRepo.GetOrderById(orderId) } // check user is valid