diff --git a/.vscode/settings.json b/.vscode/settings.json deleted file mode 100644 index b5c2b3b..0000000 --- a/.vscode/settings.json +++ /dev/null @@ -1,9 +0,0 @@ -{ - "liveSassCompile.settings.formats": [ - { - "format": "compressed", - "extensionName": ".min.css", - "savePath": "/src/public/css" - } - ] -} diff --git a/README.md b/README.md index 1dfdc66..f2904db 100644 --- a/README.md +++ b/README.md @@ -1 +1,10 @@ # Dropstore + +.env + +```bash + +MONGODB_URI= +STRIPE_API_KEY= + +``` diff --git a/data/log.txt b/data/log.txt new file mode 100644 index 0000000..f319581 --- /dev/null +++ b/data/log.txt @@ -0,0 +1,18 @@ +Sun, 03 Apr 2022 19:55:53 CEST strconv.ParseInt: parsing "favicon.ico": invalid syntax +Sun, 03 Apr 2022 21:15:51 CEST gob: type not registered for interface: primitive.ObjectID +Sun, 03 Apr 2022 21:46:31 CEST Cast failed interface{} -> string +Sun, 03 Apr 2022 21:46:48 CEST You must connect to mongoDB +Sun, 03 Apr 2022 21:47:00 CEST You must connect to mongoDB +Sun, 03 Apr 2022 21:49:36 CEST You must connect to mongoDB +Sun, 03 Apr 2022 21:50:51 CEST You must connect to mongoDB +Sun, 03 Apr 2022 21:51:44 CEST update document must contain key beginning with '$' +Sun, 03 Apr 2022 21:53:42 CEST write exception: write errors: [Unknown modifier: $canceled. Expected a valid update modifier or pipeline-style update specified as an array] +Sun, 03 Apr 2022 21:54:43 CEST write exception: write errors: [Unknown modifier: $status. Expected a valid update modifier or pipeline-style update specified as an array] +Sun, 03 Apr 2022 21:59:41 CEST the provided hex string is not a valid ObjectID +Sun, 03 Apr 2022 22:01:19 CEST the provided hex string is not a valid ObjectID +Sun, 03 Apr 2022 22:03:10 CEST Cast failed interface{} -> *primitive.ObjectID +Sun, 03 Apr 2022 22:04:00 CEST Cast failed interface{} -> primitive.ObjectID +Sun, 03 Apr 2022 22:04:58 CEST Cast failed interface{} -> primitive.ObjectID +Sun, 03 Apr 2022 22:05:46 CEST Cast failed interface{} -> primitive.ObjectID +Sun, 03 Apr 2022 22:11:48 CEST the provided hex string is not a valid ObjectID +Sun, 03 Apr 2022 22:21:26 CEST gob: type not registered for interface: primitive.ObjectID \ No newline at end of file diff --git a/go.mod b/go.mod index a8465f8..81a91f8 100644 --- a/go.mod +++ b/go.mod @@ -7,4 +7,5 @@ require ( github.com/gofiber/template v1.6.25 // indirect github.com/joho/godotenv v1.4.0 github.com/stripe/stripe-go/v72 v72.94.0 + go.mongodb.org/mongo-driver v1.8.4 // indirect ) diff --git a/go.sum b/go.sum index b592d9f..78546cf 100644 --- a/go.sum +++ b/go.sum @@ -125,6 +125,7 @@ github.com/go-kit/kit v0.8.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2 github.com/go-kit/kit v0.9.0/go.mod h1:xBxKIO96dXMWWy0MnWVtmwkA9/13aqxPnvrjFYMA2as= github.com/go-logfmt/logfmt v0.3.0/go.mod h1:Qt1PoO58o5twSAckw1HlFXLmHsOX5/0LbT9GBnD5lWE= github.com/go-logfmt/logfmt v0.4.0/go.mod h1:3RMwSq7FuexP4Kalkev3ejPJsZTpXXBr9+V4qmtdjCk= +github.com/go-stack/stack v1.8.0 h1:5SgMzNM5HxrEjV0ww2lTmX6E2Izsfxas4+YHWRs3Lsk= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/godbus/dbus/v5 v5.0.4/go.mod h1:xhWf0FNVPg57R7Z0UbKHbJfkEywrmjJnf7w5xrFpKfA= github.com/gofiber/fiber/v2 v2.29.0 h1:wopU1kXxdD9XxvQqYd1vSWMGu2PiZN0yy+DojygTRRA= @@ -164,6 +165,8 @@ github.com/golang/protobuf v1.4.3/go.mod h1:oDoupMAO8OvCJWAcko0GGGIgR6R6ocIYbsSw github.com/golang/protobuf v1.5.0/go.mod h1:FsONVRAS9T7sI+LIUmWTfcYkHO4aIWwzhcaSAoJOfIk= github.com/golang/protobuf v1.5.1/go.mod h1:DopwsBzvsk0Fs44TXzsVbJyPhcCPeIwnvohx4u74HPM= github.com/golang/protobuf v1.5.2/go.mod h1:XVQd3VNwM+JqD3oG2Ue2ip4fOMUkwXdXDdiuN0vRsmY= +github.com/golang/snappy v0.0.1/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/golang/snappy v0.0.3 h1:fHPg5GQYlCeLIPB9BZqMVR5nR9A+IM5zcgeTdjMYmLA= github.com/golang/snappy v0.0.3/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= github.com/google/btree v0.0.0-20180813153112-4030bb1f1f0c/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= @@ -250,6 +253,7 @@ github.com/jstemmer/go-junit-report v0.9.1/go.mod h1:Brl9GWCQeLvo8nXZwPNNblvFj/X github.com/julienschmidt/httprouter v1.2.0/go.mod h1:SYymIcj16QtmaHHD7aYtjjsJG7VTCxuUUipMqKk8s4w= github.com/kisielk/errcheck v1.5.0/go.mod h1:pFxgyoBC7bSaBwPgfKdkLd5X25qrDl4LWUI2bnpBCr8= github.com/kisielk/gotool v1.0.0/go.mod h1:XhKaO+MFFWcvkIS/tQcRk01m1F5IRFswLeQ+oQHNcck= +github.com/klauspost/compress v1.13.6/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/klauspost/compress v1.15.0 h1:xqfchp4whNFxn5A4XFyyYtitiWI8Hy5EW59jEwcyL6U= github.com/klauspost/compress v1.15.0/go.mod h1:/3/Vjq9QcHkK5uEr5lBEmyoZ1iFhe47etQ6QUkpK6sk= github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ= @@ -289,6 +293,7 @@ github.com/modern-go/concurrent v0.0.0-20180306012644-bacd9c7ef1dd/go.mod h1:6dJ github.com/modern-go/reflect2 v0.0.0-20180701023420-4b7aa43c6742/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.1/go.mod h1:bx2lNnkwVCuqBIxFjflWJWanXIb3RllmbCylyMrvgv0= github.com/modern-go/reflect2 v1.0.2/go.mod h1:yWuevngMOJpCy52FWWMvUC8ws7m/LJsjYzDa0/r8luk= +github.com/montanaflynn/stats v0.0.0-20171201202039-1bf9dbcd8cbe/go.mod h1:wL8QJuTMNUDYhXwkmfOly8iTdp5TEcJFWZD2D7SIkUc= github.com/mwitkow/go-conntrack v0.0.0-20161129095857-cc309e4a2223/go.mod h1:qRWi+5nqEBWmkhHvq77mSJWrCKwh8bxhgT7d/eI7P4U= github.com/niemeyer/pretty v0.0.0-20200227124842-a10e7caefd8e/go.mod h1:zD1mROLANZcx1PVRCS0qkT7pwLkGfwJo4zjcN/Tysno= github.com/pascaldekloe/goe v0.0.0-20180627143212-57f6aae5913c/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144TG7ZOy1lc= @@ -296,6 +301,8 @@ github.com/pascaldekloe/goe v0.1.0/go.mod h1:lzWF7FIEvWOWxwDKqyGYQf6ZUaNfKdP144T github.com/pelletier/go-toml v1.9.4/go.mod h1:u1nR/EPcESfeI/szUZKdtJ0xRNbUoANCkoOuaOx1Y+c= github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= +github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pkg/sftp v1.10.1/go.mod h1:lYOWFsE0bwd1+KfKJaKeuokY15vzFx25BLbzYYoAxZI= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= @@ -341,6 +348,7 @@ github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/ github.com/stripe/stripe-go/v72 v72.94.0 h1:Ivcqj+ySDodpW4XoapPa+GrHZKnMnLNUMh7ZthXysnM= github.com/stripe/stripe-go/v72 v72.94.0/go.mod h1:QwqJQtduHubZht9mek5sds9CtQcKFdsykV9ZepRWwo0= github.com/subosito/gotenv v1.2.0/go.mod h1:N0PQaV/YGNqwC0u51sEeR/aUtSLEXKX9iv69rRypqCw= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tv42/httpunix v0.0.0-20150427012821-b75d8614f926/go.mod h1:9ESjWnEqriFuLhtthL60Sar/7RFoluCcXsuvEwTV5KM= github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw= github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= @@ -348,7 +356,15 @@ github.com/valyala/fasthttp v1.34.0 h1:d3AAQJ2DRcxJYHm7OXNXtXt2as1vMDfxeIcFvhmGG github.com/valyala/fasthttp v1.34.0/go.mod h1:epZA5N+7pY6ZaEKRmstzOuYJx9HI8DI1oaCGZpdH4h0= github.com/valyala/tcplisten v1.0.0 h1:rBHj/Xf+E1tRGZyWIWwJDiRY0zc1Js+CV5DqwacVSA8= github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7FwZEA7Ioqkc= +github.com/xdg-go/pbkdf2 v1.0.0 h1:Su7DPu48wXMwC3bs7MCNG+z4FhcyEuz5dlvchbq0B0c= +github.com/xdg-go/pbkdf2 v1.0.0/go.mod h1:jrpuAogTd400dnrH08LKmI/xc1MbPOebTwRqcT5RDeI= +github.com/xdg-go/scram v1.0.2 h1:akYIkZ28e6A96dkWNJQu3nmCzH3YfwMPQExUYDaRv7w= +github.com/xdg-go/scram v1.0.2/go.mod h1:1WAq6h33pAW+iRreB34OORO2Nf7qel3VV3fjBj+hCSs= +github.com/xdg-go/stringprep v1.0.2 h1:6iq84/ryjjeRmMJwxutI51F2GIPlP5BfTvXHeYjyhBc= +github.com/xdg-go/stringprep v1.0.2/go.mod h1:8F9zXuvzgwmyT5DUm4GUfZGDdT3W+LCvS6+da4O5kxM= github.com/yosssi/ace v0.0.5/go.mod h1:ALfIzm2vT7t5ZE7uoIZqF3TQ7SAOyupFZnkrF5id+K0= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d h1:splanxYIlg+5LfHAM6xpdFEAYOk8iySO56hMFq6uLyA= +github.com/youmark/pkcs8 v0.0.0-20181117223130-1be2e3e5546d/go.mod h1:rHwXgn7JulP+udvsHwJoVG1YGAP6VLg4y9I5dyZdqmA= github.com/yuin/goldmark v1.1.25/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.27/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= github.com/yuin/goldmark v1.1.32/go.mod h1:3hX8gzYuyVAZsxl0MRgGTJEmQBFcNTphYh9decYSb74= @@ -358,6 +374,8 @@ github.com/yuin/goldmark v1.4.1/go.mod h1:mwnBkeHKe2W/ZEtQ+71ViKU8L12m81fl3OWwC1 go.etcd.io/etcd/api/v3 v3.5.1/go.mod h1:cbVKeC6lCfl7j/8jBhAK6aIYO9XOjdptoxU/nLQcPvs= go.etcd.io/etcd/client/pkg/v3 v3.5.1/go.mod h1:IJHfcCEKxYu1Os13ZdwCwIUTUVGYTSAM3YSwc9/Ac1g= go.etcd.io/etcd/client/v2 v2.305.1/go.mod h1:pMEacxZW7o8pg4CrFE7pquyCJJzZvkvdD2RibOCCCGs= +go.mongodb.org/mongo-driver v1.8.4 h1:NruvZPPL0PBcRJKmbswoWSrmHeUvzdxA3GCPfD/NEOA= +go.mongodb.org/mongo-driver v1.8.4/go.mod h1:0sQWfOeY63QTntERDJJ/0SuKK0T1uVSgKCuAROlKEPY= go.opencensus.io v0.21.0/go.mod h1:mSImk1erAIZhrmZN+AvHh14ztQfjbGwt4TtuofqLduU= go.opencensus.io v0.22.0/go.mod h1:+kGneAE2xo2IficOXnaByMWTGM9T73dGwxeWcUqIpI8= go.opencensus.io v0.22.2/go.mod h1:yxeiOL68Rb0Xd1ddK5vPZ/oVn4vY4Ynel7k9FzqtOIw= @@ -378,7 +396,9 @@ golang.org/x/crypto v0.0.0-20190820162420-60c769a6c586/go.mod h1:yigFU9vqHzYiE8U golang.org/x/crypto v0.0.0-20190923035154-9ee001bba392/go.mod h1:/lpIB1dKB+9EgE3H3cr1v9wB50oz8l4C4h62xy7jSTY= golang.org/x/crypto v0.0.0-20191011191535-87dc89f01550/go.mod h1:yigFU9vqHzYiE8UmvKecakEJjdnWj3jj499lnFckfCI= golang.org/x/crypto v0.0.0-20200622213623-75b288015ac9/go.mod h1:LzIPMQfyMNhhGPhUkYOs5KpL4U8rLKemX1yGLhDgUto= +golang.org/x/crypto v0.0.0-20201216223049-8b5274cf687f/go.mod h1:jdWPYTVW3xRLrWPugEBEK3UY2ZEsg3UU495nc5E+M+I= golang.org/x/crypto v0.0.0-20210817164053-32db794688a5/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= +golang.org/x/crypto v0.0.0-20220214200702-86341886e292 h1:f+lwQ+GtmgoY+A2YaQxlSOnDjXcQ7ZRLWOHbC6HtRqE= golang.org/x/crypto v0.0.0-20220214200702-86341886e292/go.mod h1:IxCIyHEi3zRg3s0A5j5BB6A9Jmi73HwBIUl50j+osU4= golang.org/x/exp v0.0.0-20190121172915-509febef88a4/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= golang.org/x/exp v0.0.0-20190306152737-a1d7652674e8/go.mod h1:CJ0aWSM057203Lf6IL+f9T1iT9GByDxfZKAQTCR3kQA= @@ -490,6 +510,7 @@ golang.org/x/sync v0.0.0-20200317015054-43a5402ce75a/go.mod h1:RxMgew5VJxzue5/jJ golang.org/x/sync v0.0.0-20200625203802-6e8e738ad208/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201020160332-67f06af15bc9/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sync v0.0.0-20201207232520-09787c993a3a/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= +golang.org/x/sync v0.0.0-20210220032951-036812b2e83c h1:5KslGYwFpkhGh+Q16bwMP3cOontH8FOep7tGV86Y7SQ= golang.org/x/sync v0.0.0-20210220032951-036812b2e83c/go.mod h1:RxMgew5VJxzue5/jJTE5uejpjVlOe/izrB70Jof72aM= golang.org/x/sys v0.0.0-20180823144017-11551d06cbcc/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= golang.org/x/sys v0.0.0-20180830151530-49385e6e1522/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= @@ -560,6 +581,7 @@ golang.org/x/sys v0.0.0-20211205182925-97ca703d548d/go.mod h1:oPkhp1MJrh7nUepCBc golang.org/x/sys v0.0.0-20211216021012-1d35b9e2eb4e/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9 h1:nhht2DYV/Sn3qOayu8lM+cU1ii9sTLUeBQwQQfUHtrs= golang.org/x/sys v0.0.0-20220227234510-4e6760a101f9/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= +golang.org/x/term v0.0.0-20201117132131-f5c789dd3221/go.mod h1:Nr5EML6q2oocZ2LXRh80K7BxOlk5/8JxuGnuhpl+muw= golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9snDiAeCFNEtKQo2Wmx5Cou7ajbmo= golang.org/x/term v0.0.0-20210927222741-03fcf44c2211/go.mod h1:jbD1KX2456YbFQfuXm/mYQcufACuNUgVhRMnK/tPxf8= golang.org/x/text v0.0.0-20170915032832-14c0d48ead0c/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= @@ -584,6 +606,7 @@ golang.org/x/tools v0.0.0-20190312170243-e65039ee4138/go.mod h1:LCzVGOaR6xXOjkQ3 golang.org/x/tools v0.0.0-20190425150028-36563e24a262/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190506145303-2d16b83fe98c/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= golang.org/x/tools v0.0.0-20190524140312-2c0ae7006135/go.mod h1:RgjU9mgBXZiqYHBnxXauZ1Gv1EHHAz9KjViQ78xBX0Q= +golang.org/x/tools v0.0.0-20190531172133-b3315ee88b7d/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190606124116-d0a3d012864b/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190621195816-6e04913cbbac/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= golang.org/x/tools v0.0.0-20190628153133-6cdbf07be9d0/go.mod h1:/rFqwRUd4F7ZHNgwSSTFct+R/Kf4OFW1sUzUTQQTgfc= diff --git a/src/app/app.go b/src/app/app.go index c8b0232..3ecf92e 100644 --- a/src/app/app.go +++ b/src/app/app.go @@ -2,6 +2,7 @@ package app import ( "fmt" + "log" "github.com/gofiber/fiber/v2" "github.com/gofiber/template/html" @@ -9,6 +10,8 @@ import ( "github.com/isakgranqvist2021/dropstore/src/packages" "github.com/isakgranqvist2021/dropstore/src/packages/alert" "github.com/isakgranqvist2021/dropstore/src/packages/cart" + "github.com/isakgranqvist2021/dropstore/src/services/database" + "github.com/isakgranqvist2021/dropstore/src/services/store" "github.com/isakgranqvist2021/dropstore/src/utils" "github.com/joho/godotenv" "github.com/stripe/stripe-go/v72" @@ -17,6 +20,12 @@ import ( func Run() error { godotenv.Load(".env") + if err := database.Connect(); err != nil { + log.Fatal(err) + } + + defer database.Disconnect() + serverConfig := config.GetConfig() stripe.Key = serverConfig.StripeKey @@ -30,7 +39,7 @@ func Run() error { app.Static("/public", config.BASEDIR+"/public") - store := config.NewStore() + store := store.NewStore() store.RegisterType([]cart.CartItem{}) store.RegisterType(alert.Alert{}) diff --git a/src/packages/cart/cart.controller.go b/src/packages/cart/cart.controller.go index 74f4cfb..99e77c0 100644 --- a/src/packages/cart/cart.controller.go +++ b/src/packages/cart/cart.controller.go @@ -4,13 +4,16 @@ import ( "strconv" "github.com/gofiber/fiber/v2" - "github.com/isakgranqvist2021/dropstore/src/config" + "github.com/isakgranqvist2021/dropstore/src/services/logger" + "github.com/isakgranqvist2021/dropstore/src/services/store" ) func AddToCart(c *fiber.Ctx) error { var newItem CartItem if err := c.BodyParser(&newItem); err != nil { + go logger.Log(err) + return c.JSON(fiber.Map{ "message": "Invalid request body", "success": false, @@ -21,6 +24,8 @@ func AddToCart(c *fiber.Ctx) error { productId, err := strconv.ParseInt(c.Params("ID"), 10, 64) if err != nil { + go logger.Log(err) + return c.JSON(fiber.Map{ "message": "Invalid query parameter", "success": false, @@ -31,6 +36,8 @@ func AddToCart(c *fiber.Ctx) error { newItem.ID = int(productId) if err := AddToCartAndUpdateSession(c, newItem); err != nil { + go logger.Log(err) + return c.JSON(fiber.Map{ "message": "Item has not been added to cart", "success": false, @@ -51,12 +58,16 @@ func ChangeQuantity(c *fiber.Ctx) error { productId, err := strconv.ParseInt(c.Params("ID"), 10, 64) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } err = ChangeQtyAndUpdateSession(c, int(productId), action) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } @@ -64,9 +75,11 @@ func ChangeQuantity(c *fiber.Ctx) error { } func Cart(c *fiber.Ctx) error { - sess, err := config.GetStore().Get(c) + sess, err := store.GetStore().Get(c) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } diff --git a/src/packages/cart/cart.helpers.go b/src/packages/cart/cart.helpers.go index 1221a1b..5b56caf 100644 --- a/src/packages/cart/cart.helpers.go +++ b/src/packages/cart/cart.helpers.go @@ -2,12 +2,12 @@ package cart import ( "github.com/gofiber/fiber/v2" - "github.com/isakgranqvist2021/dropstore/src/config" "github.com/isakgranqvist2021/dropstore/src/packages/product" + "github.com/isakgranqvist2021/dropstore/src/services/store" ) func AddToCartAndUpdateSession(c *fiber.Ctx, newItem CartItem) error { - sess, err := config.GetStore().Get(c) + sess, err := store.GetStore().Get(c) if err != nil { return err @@ -31,7 +31,7 @@ func AddToCartAndUpdateSession(c *fiber.Ctx, newItem CartItem) error { } func ChangeQtyAndUpdateSession(c *fiber.Ctx, productId int, action string) error { - sess, err := config.GetStore().Get(c) + sess, err := store.GetStore().Get(c) if err != nil { return err diff --git a/src/packages/order/order.controller.go b/src/packages/order/order.controller.go index 09455f9..dea5eb0 100644 --- a/src/packages/order/order.controller.go +++ b/src/packages/order/order.controller.go @@ -1,37 +1,64 @@ package order import ( - "fmt" - "log" - "github.com/gofiber/fiber/v2" "github.com/isakgranqvist2021/dropstore/src/config" "github.com/isakgranqvist2021/dropstore/src/packages/cart" "github.com/isakgranqvist2021/dropstore/src/packages/product" + "github.com/isakgranqvist2021/dropstore/src/services/logger" + "github.com/isakgranqvist2021/dropstore/src/services/store" "github.com/stripe/stripe-go/v72" "github.com/stripe/stripe-go/v72/checkout/session" ) +func GetOrderIDAndCast(c *fiber.Ctx) (*string, error) { + sess, err := store.GetStore().Get(c) + + if err != nil { + return nil, err + } + + orderId, ok := sess.Get("ORDER_ID").(string) + + if !ok { + return nil, err + } + + return &orderId, nil +} + func Cancel(c *fiber.Ctx) error { - sess, err := config.GetStore().Get(c) + orderId, err := GetOrderIDAndCast(c) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } - fmt.Println(sess.Get("STRIPE_SESSION")) + if err := UpdateOrderStatus(orderId, "canceled"); err != nil { + go logger.Log(err) + + return c.Redirect("/error") + } - return c.Redirect("/cart") + return c.Render("pages/cart/cancel", nil) } func Success(c *fiber.Ctx) error { - sess, err := config.GetStore().Get(c) + orderId, err := GetOrderIDAndCast(c) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } - fmt.Println(sess.Get("STRIPE_SESSION")) + if err := UpdateOrderStatus(orderId, "completed"); err != nil { + go logger.Log(err) + + return c.Redirect("/error") + } return c.Render("pages/cart/success", nil) } @@ -40,13 +67,16 @@ func Pay(c *fiber.Ctx) error { var body Order if err := c.BodyParser(&body); err != nil { - log.Fatal(err) + go logger.Log(err) + return c.Redirect("/error") } - sess, err := config.GetStore().Get(c) + sess, err := store.GetStore().Get(c) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } @@ -59,15 +89,28 @@ func Pay(c *fiber.Ctx) error { CancelURL: stripe.String(config.GetConfig().GetDomain() + "/order/cancel"), } + insertedID, err := CreateOrder(body) + + if err != nil { + go logger.Log(err) + + return c.Redirect("/error") + } + s, err := session.New(params) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } sess.Set("STRIPE_SESSION", s.ID) + sess.Set("ORDER_ID", insertedID.Hex()) if err := sess.Save(); err != nil { + go logger.Log(err) + return c.Redirect("/error") } diff --git a/src/packages/order/order.model.go b/src/packages/order/order.model.go index 648d5e6..7c3a1ce 100644 --- a/src/packages/order/order.model.go +++ b/src/packages/order/order.model.go @@ -6,6 +6,7 @@ import ( type Order struct { ID int + Status string Products []product.Product FirstName string `form:"firstName"` LastName string `form:"lastName"` diff --git a/src/packages/order/order.service.go b/src/packages/order/order.service.go new file mode 100644 index 0000000..5d5a499 --- /dev/null +++ b/src/packages/order/order.service.go @@ -0,0 +1,31 @@ +package order + +import ( + "github.com/isakgranqvist2021/dropstore/src/services/database" + "go.mongodb.org/mongo-driver/bson" + "go.mongodb.org/mongo-driver/bson/primitive" +) + +func CreateOrder(order Order) (*primitive.ObjectID, error) { + order.Status = "pending" + + insertOptions := database.Options{Collection: "orders", Payload: order} + + return insertOptions.InsertOne() +} + +func UpdateOrderStatus(ID *string, status string) error { + payload := bson.D{{ + Key: "$set", + Value: bson.D{ + { + Key: "status", + Value: status, + }, + }, + }} + + insertOptions := database.Options{Collection: "orders", Payload: payload} + + return insertOptions.UpdateOneByID(ID) +} diff --git a/src/packages/product/product.controller.go b/src/packages/product/product.controller.go index 7d8a724..3cdba7a 100644 --- a/src/packages/product/product.controller.go +++ b/src/packages/product/product.controller.go @@ -4,18 +4,23 @@ import ( "strconv" "github.com/gofiber/fiber/v2" + "github.com/isakgranqvist2021/dropstore/src/services/logger" ) func ViewProduct(c *fiber.Ctx) error { ID, err := strconv.ParseInt(c.Params("ID"), 10, 0) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } product, err := GetProduct(int(ID)) if err != nil { + go logger.Log(err) + return c.Redirect("/error") } @@ -28,6 +33,8 @@ func ViewProducts(c *fiber.Ctx) error { products, err := GetProducts() if err != nil { + go logger.Log(err) + return c.Redirect("/error") } diff --git a/src/packages/product/product.router.go b/src/packages/product/product.router.go index 0d98650..d17bb96 100644 --- a/src/packages/product/product.router.go +++ b/src/packages/product/product.router.go @@ -4,5 +4,5 @@ import "github.com/gofiber/fiber/v2" func ProductRouter(r fiber.Router) { r.Get("/", ViewProducts) - r.Get("/:ID", ViewProduct) + r.Get("/:PRODUCT_NAME/:ID", ViewProduct) } diff --git a/src/public/css/symbols.css b/src/public/css/symbols.css new file mode 100644 index 0000000..fb7e607 --- /dev/null +++ b/src/public/css/symbols.css @@ -0,0 +1,81 @@ +.uk-container { + height: calc(100vh - 54px); +} + +svg { + width: 100px; + display: block; + margin: 40px auto 0; +} + +.path { + stroke-dasharray: 1000; + stroke-dashoffset: 0; +} + +.path.circle { + -webkit-animation: dash 0.9s ease-in-out; + animation: dash 0.9s ease-in-out; +} + +.path.line { + stroke-dashoffset: 1000; + -webkit-animation: dash 0.9s 0.35s ease-in-out forwards; + animation: dash 0.9s 0.35s ease-in-out forwards; +} + +.path.check { + stroke-dashoffset: -100; + -webkit-animation: dash-check 0.9s 0.35s ease-in-out forwards; + animation: dash-check 0.9s 0.35s ease-in-out forwards; +} + +p { + text-align: center; + margin: 20px 0 60px; + font-size: 1.25em; +} + +p.success { + color: #73af55; +} + +p.error { + color: #d06079; +} + +@-webkit-keyframes dash { + 0% { + stroke-dashoffset: 1000; + } + 100% { + stroke-dashoffset: 0; + } +} + +@keyframes dash { + 0% { + stroke-dashoffset: 1000; + } + 100% { + stroke-dashoffset: 0; + } +} + +@-webkit-keyframes dash-check { + 0% { + stroke-dashoffset: -100; + } + 100% { + stroke-dashoffset: 900; + } +} + +@keyframes dash-check { + 0% { + stroke-dashoffset: -100; + } + 100% { + stroke-dashoffset: 900; + } +} diff --git a/src/services/database/database.connect.go b/src/services/database/database.connect.go new file mode 100644 index 0000000..f5a9a1f --- /dev/null +++ b/src/services/database/database.connect.go @@ -0,0 +1,44 @@ +package database + +import ( + "context" + "fmt" + "os" + + "github.com/isakgranqvist2021/dropstore/src/services/logger" + "go.mongodb.org/mongo-driver/mongo" + "go.mongodb.org/mongo-driver/mongo/options" +) + +var Client *mongo.Client = nil + +type Options struct { + Collection string + Payload interface{} +} + +func Disconnect() error { + fmt.Println("Disconnect") + + if err := Client.Disconnect(context.TODO()); err != nil { + go logger.Log(err) + + return err + } + + return nil +} + +func Connect() error { + fmt.Println("Connect") + + client, err := mongo.Connect(context.TODO(), options.Client().ApplyURI(os.Getenv("MONGODB_URI"))) + + if err != nil { + return err + } + + Client = client + + return nil +} diff --git a/src/services/database/database.create.go b/src/services/database/database.create.go new file mode 100644 index 0000000..f52935e --- /dev/null +++ b/src/services/database/database.create.go @@ -0,0 +1,27 @@ +package database + +import ( + "context" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +func (options Options) InsertOne() (*primitive.ObjectID, error) { + db, err := GetDb() + + if err != nil { + return nil, err + } + + collection := db.Collection(options.Collection) + + result, err := collection.InsertOne(context.TODO(), options.Payload) + + if err != nil { + return nil, err + } + + insertedId := result.InsertedID.(primitive.ObjectID) + + return &insertedId, err +} diff --git a/src/services/database/database.update.go b/src/services/database/database.update.go new file mode 100644 index 0000000..8175215 --- /dev/null +++ b/src/services/database/database.update.go @@ -0,0 +1,34 @@ +package database + +import ( + "context" + "fmt" + + "go.mongodb.org/mongo-driver/bson/primitive" +) + +func (options Options) UpdateOneByID(ID *string) error { + db, err := GetDb() + + if err != nil { + return err + } + + coll := db.Collection(options.Collection) + + objectId, err := primitive.ObjectIDFromHex(*ID) + + if err != nil { + return err + } + + result, err := coll.UpdateByID( + context.TODO(), + objectId, + options.Payload, + ) + + fmt.Println(result.ModifiedCount) + + return err +} diff --git a/src/services/database/database.utils.go b/src/services/database/database.utils.go new file mode 100644 index 0000000..aeb7bf7 --- /dev/null +++ b/src/services/database/database.utils.go @@ -0,0 +1,15 @@ +package database + +import ( + "errors" + + "go.mongodb.org/mongo-driver/mongo" +) + +func GetDb() (*mongo.Database, error) { + if Client != nil { + return Client.Database("dropstore"), nil + } + + return nil, errors.New("You must connect to mongoDB") +} diff --git a/src/services/logger/logger.go b/src/services/logger/logger.go new file mode 100644 index 0000000..1533b11 --- /dev/null +++ b/src/services/logger/logger.go @@ -0,0 +1,25 @@ +package logger + +import ( + "fmt" + "io/ioutil" + "time" +) + +func Log(err error) { + bytes, _ := ioutil.ReadFile("./data/log.txt") + + newRow := fmt.Sprintf("%v %s", + time.Now().Format(time.RFC1123), + err.Error(), + ) + + prev := string(bytes) + output := fmt.Sprintf("%s", newRow) + + if len(prev) > 0 { + output = fmt.Sprintf("%s\n%s", prev, newRow) + } + + ioutil.WriteFile("./data/log.txt", []byte(output), 0644) +} diff --git a/src/config/sessions.go b/src/services/store/store.go similarity index 93% rename from src/config/sessions.go rename to src/services/store/store.go index da12208..d7f9bb3 100644 --- a/src/config/sessions.go +++ b/src/services/store/store.go @@ -1,4 +1,4 @@ -package config +package store import ( "github.com/gofiber/fiber/v2/middleware/session" diff --git a/src/views/layouts/main.html b/src/views/layouts/main.html index 3fa5cf6..ab24bf4 100644 --- a/src/views/layouts/main.html +++ b/src/views/layouts/main.html @@ -9,6 +9,11 @@ href="https://cdn.jsdelivr.net/npm/uikit@3.13.5/dist/css/uikit.min.css" /> + Document diff --git a/src/views/pages/cart/cancel.html b/src/views/pages/cart/cancel.html index f55d32b..0d0ac23 100644 --- a/src/views/pages/cart/cancel.html +++ b/src/views/pages/cart/cancel.html @@ -1 +1,47 @@ -

Cancel

+ + +
+ + + + + +

Purchase error!

+ + Back to cart +
diff --git a/src/views/pages/cart/index.html b/src/views/pages/cart/index.html index 63ba3d3..e515a35 100644 --- a/src/views/pages/cart/index.html +++ b/src/views/pages/cart/index.html @@ -1,4 +1,5 @@
+ {{ if .Products }}
@@ -48,7 +49,7 @@ for="postalCode" >Postal Code - +
@@ -56,7 +57,7 @@
+ {{ else }} +
+

empty cart

+
Back to products +
+ {{ end }} diff --git a/src/views/pages/cart/success.html b/src/views/pages/cart/success.html index 5006e94..d955444 100644 --- a/src/views/pages/cart/success.html +++ b/src/views/pages/cart/success.html @@ -1 +1,30 @@ -

Success

+ + +
+ + + + +

Purchase success!

+
diff --git a/src/views/pages/product/index.html b/src/views/pages/product/index.html index 5f26945..7cf5ec9 100644 --- a/src/views/pages/product/index.html +++ b/src/views/pages/product/index.html @@ -1,7 +1,7 @@
{{ range .Products }} - +
- + {{ .Product.Name }}

{{ .Product.Name }}

@@ -17,8 +17,8 @@

{{ .Product.Amount }} SEK