diff --git a/app.go b/app.go index 91814d0..e8c82c0 100644 --- a/app.go +++ b/app.go @@ -1,10 +1,11 @@ package main import ( - "github.com/gin-gonic/gin" - "tat_gogogo/configs" - "tat_gogogo/interface/routes" "log" + "tat_gogogo/configs" + "tat_gogogo/infrastructure/router" + + "github.com/gin-gonic/gin" ) func run() { @@ -18,7 +19,7 @@ func run() { httpServer = gin.Default() - routes.RegisterRoutes(httpServer) + router.Register(httpServer) serverAddr := configuration.Constants.Host + ":" + configuration.Constants.Port diff --git a/go.mod b/go.mod index 54b6390..fa98e90 100644 --- a/go.mod +++ b/go.mod @@ -4,8 +4,8 @@ go 1.12 require ( github.com/PuerkitoBio/goquery v1.5.0 + github.com/appleboy/gin-jwt/v2 v2.6.2 github.com/gin-gonic/gin v1.4.0 - github.com/gorilla/mux v1.7.2 // indirect github.com/spf13/viper v1.4.0 golang.org/x/text v0.3.0 gopkg.in/mgo.v2 v2.0.0-20180705113604-9856a29383ce // indirect diff --git a/go.sum b/go.sum index e0c93f7..db77dfa 100644 --- a/go.sum +++ b/go.sum @@ -1,6 +1,7 @@ cloud.google.com/go v0.26.0/go.mod h1:aQUYkXzVsufM+DwF1aE+0xfcU+56JwCaLick0ClmMTw= github.com/BurntSushi/toml v0.3.1 h1:WXkYYl6Yr3qBf1K79EBnL4mak0OimBfB0XUf9Vl28OQ= github.com/BurntSushi/toml v0.3.1/go.mod h1:xHWCNGjB5oqiDr8zfno3MHue2Ht5sIBksp03qcyfWMU= +github.com/Knetic/govaluate v3.0.0+incompatible/go.mod h1:r7JcOSlj0wfOMncg0iLm8Leh48TZaKVeNIfJntJ2wa0= github.com/OneOfOne/xxhash v1.2.2/go.mod h1:HSdplMjZKSmBqAxg5vPj2TmRDmfkzw+cTzAElWljhcU= github.com/PuerkitoBio/goquery v1.5.0 h1:uGvmFXOA73IKluu/F84Xd1tt/z07GYm8X49XKHP7EJk= github.com/PuerkitoBio/goquery v1.5.0/go.mod h1:qD2PgZ9lccMbQlc7eEOjaeRlFQON7xY8kdmcsrnKqMg= @@ -8,22 +9,40 @@ github.com/alecthomas/template v0.0.0-20160405071501-a0175ee3bccc/go.mod h1:LOuy github.com/alecthomas/units v0.0.0-20151022065526-2efee857e7cf/go.mod h1:ybxpYRFXyAe+OPACYpWeL0wqObRcbAqCMya13uyzqw0= github.com/andybalholm/cascadia v1.0.0 h1:hOCXnnZ5A+3eVDX8pvgl4kofXv2ELss0bKcqRySc45o= github.com/andybalholm/cascadia v1.0.0/go.mod h1:GsXiBklL0woXo1j/WYWtSYYC4ouU9PqHO0sqidkEA4Y= +github.com/appleboy/gin-jwt/v2 v2.6.2 h1:aW8jd9Zt5lU5W18GvLMO3/T9O8DETfW3O7GzGxcL6So= +github.com/appleboy/gin-jwt/v2 v2.6.2/go.mod h1:fPyTIp4l5gtQnThEGuMBzCcfvMVSs9dsfrZlXsaTJMY= +github.com/appleboy/gofight/v2 v2.1.1 h1:mBiMmXAofKf1GdEHxp8QkfrRaj/nBCoDnkwjn8axsq8= +github.com/appleboy/gofight/v2 v2.1.1/go.mod h1:6E7pthKhmwss84j/zEixBNim8Q6ahhHcYOtmW5ts5vA= github.com/armon/consul-api v0.0.0-20180202201655-eb2c6b5be1b6/go.mod h1:grANhF5doyWs3UAsr3K4I6qtAmlQcZDesFNEHPZAzj8= +github.com/astaxie/beego v1.11.1/go.mod h1:i69hVzgauOPSw5qeyF4GVZhn7Od0yG5bbCGzmhbWxgQ= +github.com/beego/goyaml2 v0.0.0-20130207012346-5545475820dd/go.mod h1:1b+Y/CofkYwXMUU0OhQqGvsY2Bvgr4j6jfT699wyZKQ= +github.com/beego/x2j v0.0.0-20131220205130-a0352aadc542/go.mod h1:kSeGC/p1AbBiEp5kat81+DSQrZenVBZXklMLaELspWU= +github.com/belogik/goes v0.0.0-20151229125003-e54d722c3aff/go.mod h1:PhH1ZhyCzHKt4uAasyx+ljRCgoezetRNf59CUtwUkqY= github.com/beorn7/perks v0.0.0-20180321164747-3a771d992973/go.mod h1:Dwedo/Wpr24TaqPxmxbtue+5NUziq4I4S80YR8gNf3Q= github.com/beorn7/perks v1.0.0/go.mod h1:KWe93zE9D1o94FZ5RNwFwVgaQK1VOXiVxmqh+CedLV8= +github.com/bradfitz/gomemcache v0.0.0-20180710155616-bc664df96737/go.mod h1:PmM6Mmwb0LSuEubjR8N7PtNe1KxZLtOUHtbeikc5h60= +github.com/casbin/casbin v1.7.0/go.mod h1:c67qKN6Oum3UF5Q1+BByfFxkwKvhwW57ITjqwtzR1KE= github.com/cespare/xxhash v1.1.0/go.mod h1:XrSqR1VqqWfGrhpAt58auRo0WTKS1nRRg3ghfAqPWnc= github.com/client9/misspell v0.3.4/go.mod h1:qj6jICC3Q7zFZvVWo7KLAzC3yx5G7kyvSDkc90ppPyw= +github.com/cloudflare/golz4 v0.0.0-20150217214814-ef862a3cdc58/go.mod h1:EOBUe0h4xcZ5GoxqC5SDxFQ8gwyZPKQoEzownBlhI80= github.com/coreos/bbolt v1.3.2/go.mod h1:iRUV2dpdMOn7Bo10OQBFzIJO9kkE559Wcmn+qkEiiKk= github.com/coreos/etcd v3.3.10+incompatible/go.mod h1:uF7uidLiAD3TWHmW31ZFd/JWoc32PjwdhPthX9715RE= github.com/coreos/go-semver v0.2.0/go.mod h1:nnelYz7RCh+5ahJtPPxZlU+153eP4D4r3EedlOD2RNk= github.com/coreos/go-systemd v0.0.0-20190321100706-95778dfbb74e/go.mod h1:F5haX7vjVVG0kc13fIWeqUViNPyEJxv/OmvnBo0Yme4= github.com/coreos/pkg v0.0.0-20180928190104-399ea9e2e55f/go.mod h1:E3G3o1h8I7cfcXa63jLwjI0eiQQMgzzUDFVpN/nH/eA= +github.com/couchbase/go-couchbase v0.0.0-20181122212707-3e9b6e1258bb/go.mod h1:TWI8EKQMs5u5jLKW/tsb9VwauIrMIxQG1r5fMsswK5U= +github.com/couchbase/gomemcached v0.0.0-20181122193126-5125a94a666c/go.mod h1:srVSlQLB8iXBVXHgnqemxUXqN6FCvClgCMPCsjBDR7c= +github.com/couchbase/goutils v0.0.0-20180530154633-e865a1461c8a/go.mod h1:BQwMFlJzDjFDG3DJUdU0KORxn88UlsOULuxLExMh3Hs= +github.com/cupcake/rdb v0.0.0-20161107195141-43ba34106c76/go.mod h1:vYwsqCOLxGiisLwp9rITslkFNpZD5rz43tf41QFkTWY= github.com/davecgh/go-spew v1.1.0 h1:ZDRjVQ15GmhC3fiQ8ni8+OwkZQO4DARzQgrnXU1Liz8= 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/dgrijalva/jwt-go v3.2.0+incompatible h1:7qlOGliEKZXTDg6OTjfoBKDXWrumCAMpl/TFQ4/5kLM= github.com/dgrijalva/jwt-go v3.2.0+incompatible/go.mod h1:E3ru+11k8xSBh+hMPgOLZmtrrCbhqsmaPHjLKYnJCaQ= github.com/dgryski/go-sip13 v0.0.0-20181026042036-e10d5fee7954/go.mod h1:vAd38F8PWV+bWy6jNmig1y/TA+kYO4g3RSRF0IAv0no= +github.com/edsrzf/mmap-go v0.0.0-20170320065105-0bce6a688712/go.mod h1:YO35OhQPt3KJa3ryjFM5Bs14WD66h8eGKpfaBNrHW5M= +github.com/elazarl/go-bindata-assetfs v1.0.0/go.mod h1:v+YaWX3bdea5J/mo8dSETolEo7R71Vk1u8bnjau5yw4= github.com/fsnotify/fsnotify v1.4.7 h1:IXs+QLmnXW2CcXuY+8Mzv/fWEsPGWxqefPtCP5CnV9I= github.com/fsnotify/fsnotify v1.4.7/go.mod h1:jwhsz4b93w/PPRr/qN1Yymfu8t87LnFCMoQvtojpjFo= github.com/ghodss/yaml v1.0.0/go.mod h1:4dBDuWmgqj2HViK6kFavaiC9ZROes6MMH2rRYeMEF04= @@ -34,6 +53,8 @@ github.com/gin-gonic/gin v1.4.0/go.mod h1:OW2EZn3DO8Ln9oIKOvM++LBO+5UPHJJDH72/q/ github.com/go-kit/kit v0.8.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-redis/redis v6.14.2+incompatible/go.mod h1:NAIEuMOZ/fxfXJIrKDQDz8wamY7mA7PouImQ2Jvg6kA= +github.com/go-sql-driver/mysql v1.4.1/go.mod h1:zAC/RDZ24gD3HViQzih4MyKcchzm+sOG5ZlKdlhCg5w= github.com/go-stack/stack v1.8.0/go.mod h1:v0f6uXyyMGvRgIKkXu+yp6POWl0qKG85gN/melR3HDY= github.com/gogo/protobuf v1.1.1/go.mod h1:r8qH/GZQm5c6nD/R0oafs1akxWv10x8SbQlK7atdtwQ= github.com/gogo/protobuf v1.2.1/go.mod h1:hp+jE20tsWTFYpLwKvXlhS1hjn+gTNwPg2I6zVXpSg4= @@ -43,10 +64,14 @@ github.com/golang/mock v1.1.1/go.mod h1:oTYuIxOrZwtPieC+H1uAHpcLFnEyAGVDL/k47Jfb github.com/golang/protobuf v1.2.0/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= github.com/golang/protobuf v1.3.1 h1:YF8+flBXS5eO826T4nzqPrxfhQThhXl0YzfuUPu4SBg= github.com/golang/protobuf v1.3.1/go.mod h1:6lQm79b+lXiMfvg/cZm0SGofjICqVBUtrP5yJMmIC1U= +github.com/golang/snappy v0.0.0-20180518054509-2e65f85255db/go.mod h1:/XxbfmMg8lxefKM7IXC3fBNl/7bRcc72aCRzEWrmP2Q= +github.com/gomodule/redigo v2.0.0+incompatible/go.mod h1:B4C85qUVwatsJoIUNIfCRsp7qO0iAmpGFZ4EELWSbC4= github.com/google/btree v1.0.0/go.mod h1:lNA+9X1NB3Zf8V7Ke586lFgjr2dZNuvo3lPJSGZ5JPQ= github.com/google/go-cmp v0.2.0/go.mod h1:oXzfMopK8JAjlY9xF4vHSVASa0yLyX7SntLO5aqRK0M= +github.com/gorilla/context v1.1.1/go.mod h1:kBGZzfjB9CEq2AlWe17Uuf7NDRt0dE0s8S51q0aT7Yg= github.com/gorilla/mux v1.7.2 h1:zoNxOV7WjqXptQOVngLmcSQgXmgk4NMz1HibBchjl/I= github.com/gorilla/mux v1.7.2/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/pat v0.0.0-20180118222023-199c85a7f6d1/go.mod h1:YeAe0gNeiNT5hoiZRI4yiOky6jVdNvfO2N6Kav/HmxY= github.com/gorilla/websocket v1.4.0/go.mod h1:E7qHFY5m1UJ88s3WnNqhKjPHQ0heANvMoAMk2YaljkQ= github.com/grpc-ecosystem/go-grpc-middleware v1.0.0/go.mod h1:FiyG127CGDf3tlThmgyCl78X/SZQqEOJBCDaAfeWzPs= github.com/grpc-ecosystem/go-grpc-prometheus v1.2.0/go.mod h1:8NvIoxWQoOIhqOTXgfV/d3M/q6VIi02HzZEHgUlZvzk= @@ -63,10 +88,17 @@ github.com/kr/logfmt v0.0.0-20140226030751-b84e30acd515/go.mod h1:+0opPa2QZZtGFB github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo= github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ= github.com/kr/text v0.1.0/go.mod h1:4Jbv+DJW3UT/LiOwJeYQe1efqtUx/iVham/4vfdArNI= +github.com/labstack/echo v3.3.10+incompatible/go.mod h1:0INS7j/VjnFxD4E2wkz67b8cVwCLbBmJyDaka6Cmk1s= +github.com/labstack/gommon v0.2.8/go.mod h1:/tj9csK2iPSBvn+3NLM9e52usepMtrd5ilFYA+wQNJ4= +github.com/lib/pq v1.0.0/go.mod h1:5WUZQaWbwv1U+lTReE5YruASi9Al49XbQIvNi/34Woo= github.com/magiconair/properties v1.8.0 h1:LLgXmsheXeRoUOBOjtwPQCWIYqM/LU1ayDtDePerRcY= github.com/magiconair/properties v1.8.0/go.mod h1:PppfXfuXeibc/6YijjN8zIbojt8czPbwD3XqdrwzmxQ= +github.com/mattn/go-colorable v0.1.2/go.mod h1:U0ppj6V5qS13XJ6of8GYAs25YV2eR4EVcfRqFIhoBtE= github.com/mattn/go-isatty v0.0.7 h1:UvyT9uN+3r7yLEYSlJsbQGdsaB/a0DlgWP3pql6iwOc= github.com/mattn/go-isatty v0.0.7/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-isatty v0.0.8 h1:HLtExJ+uU2HOZ+wI0Tt5DtUDrx8yhUqDcp7fYERX4CE= +github.com/mattn/go-isatty v0.0.8/go.mod h1:Iq45c/XA43vh69/j3iqttzPXn0bhXyGjM0Hdxcsrc5s= +github.com/mattn/go-sqlite3 v1.10.0/go.mod h1:FPy6KqzDD04eiIsT53CuJW3U88zkxoIYsOqkbpncsNc= github.com/matttproud/golang_protobuf_extensions v1.0.1/go.mod h1:D8He9yQNgCq6Z5Ld7szi9bcBfOoFv/3dc6xSMkL2PC0= github.com/mitchellh/mapstructure v1.1.2 h1:fmNYVwqnSfB9mZU6OS2O6GsXM+wcskZDuKQzvN1EDeE= github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= @@ -89,6 +121,9 @@ github.com/prometheus/procfs v0.0.0-20181005140218-185b4288413d/go.mod h1:c3At6R github.com/prometheus/procfs v0.0.0-20190507164030-5867b95ac084/go.mod h1:TjEm7ze935MbeOT/UhFTIMYKhuLP4wbCsTZCD3I8kEA= github.com/prometheus/tsdb v0.7.1/go.mod h1:qhTCs0VvXwvX/y3TZrWD7rabWM+ijKTux40TwIPHuXU= github.com/rogpeppe/fastuuid v0.0.0-20150106093220-6724a57986af/go.mod h1:XWv6SoW27p1b0cqNHllgS5HIMJraePCO15w5zCzIWYg= +github.com/siddontang/go v0.0.0-20180604090527-bdc77568d726/go.mod h1:3yhqj7WBBfRhbBlzyOC3gUxftwsU0u8gqevxwIHQpMw= +github.com/siddontang/ledisdb v0.0.0-20181029004158-becf5f38d373/go.mod h1:mF1DpOSOUiJRMR+FDqaqu3EBqrybQtrDDszLUZ6oxPg= +github.com/siddontang/rdb v0.0.0-20150307021120-fc89ed2e418d/go.mod h1:AMEsy7v5z92TR1JKMkLLoaOQk++LVnOKL3ScbJ8GNGA= github.com/sirupsen/logrus v1.2.0/go.mod h1:LxeOpSwHxABJmUn/MG1IvRgCAasNZTLOkJPxbbu5VWo= github.com/soheilhy/cmux v0.1.4/go.mod h1:IM3LyeVVIOuxMH7sFAkER9+bJ4dT7Ms6E4xg4kGIyLM= github.com/spaolacci/murmur3 v0.0.0-20180118202830-f09979ecbc72/go.mod h1:JwIasOWyU6f++ZhiEuf87xNszmSA2myDM2Kzu9HwQUA= @@ -102,14 +137,26 @@ github.com/spf13/pflag v1.0.3 h1:zPAT6CGy6wXeQ7NtTnaTerfKOsV6V6F8agHXFiazDkg= github.com/spf13/pflag v1.0.3/go.mod h1:DYY7MBk1bdzusC3SYhjObp+wFpr4gzcvqqNjLnInEg4= github.com/spf13/viper v1.4.0 h1:yXHLWeravcrgGyFSyCgdYpXQ9dR9c/WED3pg1RhxqEU= github.com/spf13/viper v1.4.0/go.mod h1:PTJ7Z/lr49W6bUbkmS1V3by4uWynFiR9p7+dSq/yZzE= +github.com/ssdb/gossdb v0.0.0-20180723034631-88f6b59b84ec/go.mod h1:QBvMkMya+gXctz3kmljlUCu/yB3GZ6oee+dUozsezQE= github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/syndtr/goleveldb v0.0.0-20181127023241-353a9fca669c/go.mod h1:Z4AUp2Km+PwemOoO/VB5AOx9XSsIItzFjoJlOSiYmn0= +github.com/tidwall/gjson v1.2.1 h1:j0efZLrZUvNerEf6xqoi0NjWMK5YlLrR7Guo/dxY174= +github.com/tidwall/gjson v1.2.1/go.mod h1:c/nTNbUr0E0OrXEhq1pwa8iEgc2DOt4ZZqAt1HtCkPA= +github.com/tidwall/match v1.0.1 h1:PnKP62LPNxHKTwvHHZZzdOAOCtsJTjo6dZLCwpKm5xc= +github.com/tidwall/match v1.0.1/go.mod h1:LujAq0jyVjBy028G1WhWfIzbpQfMO8bBZ6Tyb0+pL9E= +github.com/tidwall/pretty v0.0.0-20190325153808-1166b9ac2b65/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= +github.com/tidwall/pretty v1.0.0 h1:HsD+QiTn7sK6flMKIvNmpqz1qrpP3Ps6jOKIKMooyg4= +github.com/tidwall/pretty v1.0.0/go.mod h1:XNkn88O1ChpSDQmQeStsy+sBenx6DDtFZJxhVysOjyk= github.com/tmc/grpc-websocket-proxy v0.0.0-20190109142713-0ad062ec5ee5/go.mod h1:ncp9v5uamzpCO7NfCPTXjqaC+bZgJeR0sMTm6dMHP7U= github.com/ugorji/go v1.1.4 h1:j4s+tAvLfL3bZyefP2SEWmhBzmuIlH/eqNuPdFPgngw= github.com/ugorji/go v1.1.4/go.mod h1:uQMGLiO92mf5W77hV/PUCpI3pbzQx3CRekS0kk+RGrc= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= +github.com/wendal/errors v0.0.0-20130201093226-f66c77a7882b/go.mod h1:Q12BUT7DqIlHRmgv3RskH+UCM/4eqVMgI0EMmlSpAXc= github.com/xiang90/probing v0.0.0-20190116061207-43a291ad63a2/go.mod h1:UETIi67q53MR2AWcXfiuqkDkRtnGDLqkBTpCHuJHxtU= github.com/xordataexchange/crypt v0.0.3-0.20170626215501-b2862e3d0a77/go.mod h1:aYKd//L2LvnjZzWKhF00oedf4jCCReLcmhLdhm1A27Q= go.etcd.io/bbolt v1.3.2/go.mod h1:IbVyRI1SCnLcuJnV2u8VeU0CEYM7e686BmAb1XKL+uU= @@ -117,6 +164,7 @@ go.uber.org/atomic v1.4.0/go.mod h1:gD2HeocX3+yG+ygLZcrzQJaqmWj9AIm7n08wl/qW/PE= go.uber.org/multierr v1.1.0/go.mod h1:wR5kodmAFQ0UK8QlbwjlSNy0Z68gJhDJUG5sjR94q/0= go.uber.org/zap v1.10.0/go.mod h1:vwi/ZaCAaUcBkycHslxD9B2zi4UTXhF60s6SWpuDF0Q= golang.org/x/crypto v0.0.0-20180904163835-0709b304e793/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= +golang.org/x/crypto v0.0.0-20181127143415-eb0de9b17e85/go.mod h1:6SG95UA2DQfeDnfUPMdvaQW0Q7yPrPDi9nlGo2tz2b4= golang.org/x/crypto v0.0.0-20190308221718-c2843e01d9a2/go.mod h1:djNgcEr1/C05ACkg1iLfiJU5Ep61QUkGW8qpdssI0+w= golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE= golang.org/x/lint v0.0.0-20190313153728-d0100b6bd8b3/go.mod h1:6SW0HCj/g11FgYtHlgUYUwCkIfeOF89ocIRzGO/8vkc= diff --git a/infrastructure/api/handler/courses_handler.go b/infrastructure/api/handler/courses_handler.go new file mode 100644 index 0000000..e7a6370 --- /dev/null +++ b/infrastructure/api/handler/courses_handler.go @@ -0,0 +1,88 @@ +package handler + +import ( + "log" + "tat_gogogo/domain/model" + "tat_gogogo/domain/repository" + "tat_gogogo/domain/service" + "tat_gogogo/interface/controller" + "tat_gogogo/usecase" + + jwt "github.com/appleboy/gin-jwt/v2" + "github.com/gin-gonic/gin" +) + +/* +CoursesHandler is a function for gin to handle courses api +*/ +func CoursesHandler(c *gin.Context) { + targetStudentID := c.Query("targetStudentID") + year := c.Query("year") + semester := c.Query("semester") + + claims := jwt.ExtractClaims(c) + studentID := claims["studentID"].(string) + password := claims["password"].(string) + + loginController := controller.NewLoginController(studentID, password) + courseController := controller.NewCoursesController(studentID, password, targetStudentID, year, semester) + + result, err := loginController.Login() + if err != nil { + c.Status(500) + return + } + + if !result.GetSuccess() { + c.JSON(401, gin.H{ + "message": result.GetData(), + }) + return + } + + isLoginCurriculumSuccess, err := loginController.LoginCurriculum() + if err != nil { + c.Status(500) + return + } + + if !isLoginCurriculumSuccess { + c.JSON(401, gin.H{ + "message": "登入課程系統失敗", + }) + return + } + + curriculums, err := courseController.GetCurriculums() + if err != nil { + c.Status(500) + return + } + + isSameYearAndSem := courseController.IsSameYearAndSem(curriculums) + + if !isSameYearAndSem { + result := getNoDataResult() + c.JSON(result.GetStatus(), gin.H{ + "message": result.GetData(), + }) + return + } + + infoResult, err := courseController.GetInfoResult() + if err != nil { + log.Panicln(err) + c.Status(500) + return + } + + c.JSON(infoResult.GetStatus(), infoResult.GetData()) + +} + +func getNoDataResult() *model.Result { + resultRepo := repository.NewResultRepository() + resultService := service.NewResultService(resultRepo) + resultUsecase := usecase.NewResultUseCase(resultRepo, resultService) + return resultUsecase.GetNoDataResult() +} diff --git a/infrastructure/api/handler/curriculum_handler.go b/infrastructure/api/handler/curriculum_handler.go new file mode 100644 index 0000000..7e47d75 --- /dev/null +++ b/infrastructure/api/handler/curriculum_handler.go @@ -0,0 +1,57 @@ +package handler + +import ( + "tat_gogogo/interface/controller" + + jwt "github.com/appleboy/gin-jwt/v2" + + "github.com/gin-gonic/gin" +) + +/* +CurriculumHandler is a function for gin to handle curriculum api +*/ +func CurriculumHandler(c *gin.Context) { + targetStudentID := c.Query("targetStudentID") + + claims := jwt.ExtractClaims(c) + studentID := claims["studentID"].(string) + password := claims["password"].(string) + + loginController := controller.NewLoginController(studentID, password) + curriculumController := controller.NewCurriculumController(studentID, password, targetStudentID) + + result, err := loginController.Login() + if err != nil { + c.Status(500) + return + } + + if !result.GetSuccess() { + c.JSON(401, gin.H{ + "message": result.GetData(), + }) + return + } + + isLoginCurriculumSuccess, err := loginController.LoginCurriculum() + if err != nil { + c.Status(500) + return + } + + if !isLoginCurriculumSuccess { + c.JSON(401, gin.H{ + "message": "登入課程系統失敗", + }) + return + } + + curriculumResult, err := curriculumController.GetCurriculumResult() + if err != nil { + c.Status(500) + return + } + + c.JSON(curriculumResult.GetStatus(), curriculumResult.GetData()) +} diff --git a/infrastructure/api/handler/login_handelr.go b/infrastructure/api/handler/login_handelr.go new file mode 100644 index 0000000..7d64602 --- /dev/null +++ b/infrastructure/api/handler/login_handelr.go @@ -0,0 +1,42 @@ +package handler + +import ( + "log" + + "tat_gogogo/infrastructure/middleware" + "tat_gogogo/interface/controller" + + "github.com/gin-gonic/gin" +) + +/* +LoginHandler is a function for gin to handle login api +*/ +func LoginHandler(c *gin.Context) { + authMiddleware, err := middleware.NewAuthMiddleware() + if err != nil { + log.Printf("JWT Error:" + err.Error()) + c.Status(500) + } + + studentID := c.PostForm("studentID") + password := c.PostForm("password") + + loginController := controller.NewLoginController(studentID, password) + result, err := loginController.Login() + + if err != nil { + log.Printf("failed to fetch login cookie") + c.Status(500) + return + } + + if result.GetStatus() != 200 { + c.JSON(result.GetStatus(), gin.H{ + "message": result.GetData(), + }) + return + } + + authMiddleware.LoginHandler(c) +} diff --git a/infrastructure/middleware/middleware.go b/infrastructure/middleware/middleware.go new file mode 100644 index 0000000..ae3e872 --- /dev/null +++ b/infrastructure/middleware/middleware.go @@ -0,0 +1,70 @@ +package middleware + +import ( + "time" + + jwt "github.com/appleboy/gin-jwt/v2" + "github.com/gin-gonic/gin" +) + +type login struct { + StudentID string `form:"studentID" json:"studentID" binding:"required"` + Password string `form:"password" json:"password" binding:"required"` +} + +/* +NewAuthMiddleware handles jwt middleware +*/ +func NewAuthMiddleware() (*jwt.GinJWTMiddleware, error) { + return jwt.New(&jwt.GinJWTMiddleware{ + Realm: "jwt", + Key: []byte("secret key"), + Timeout: time.Hour, + MaxRefresh: time.Hour, + PayloadFunc: func(data interface{}) jwt.MapClaims { + if v, ok := data.(*login); ok { + return jwt.MapClaims{ + "studentID": v.StudentID, + "password": v.Password, + } + } + return jwt.MapClaims{} + }, + IdentityHandler: func(c *gin.Context) interface{} { + claims := jwt.ExtractClaims(c) + + return &login{ + StudentID: claims["studentID"].(string), + Password: claims["password"].(string), + } + }, + Authenticator: func(c *gin.Context) (interface{}, error) { + var loginVals login + if err := c.ShouldBind(&loginVals); err != nil { + return "", jwt.ErrMissingLoginValues + } + + studentID := loginVals.StudentID + password := loginVals.Password + + return &login{StudentID: studentID, Password: password}, nil + }, + Authorizator: func(data interface{}, c *gin.Context) bool { + if _, ok := data.(*login); ok { + return true + } + + return false + }, + Unauthorized: func(c *gin.Context, code int, message string) { + c.JSON(code, gin.H{ + "code": code, + "message": message, + }) + }, + TokenLookup: "header: Authorization, query: token, cookie: jwt", + TokenHeadName: "Bearer", + TimeFunc: time.Now, + }) + +} diff --git a/infrastructure/router/router.go b/infrastructure/router/router.go new file mode 100644 index 0000000..b45da0d --- /dev/null +++ b/infrastructure/router/router.go @@ -0,0 +1,28 @@ +package router + +import ( + "log" + "tat_gogogo/infrastructure/api/handler" + "tat_gogogo/infrastructure/middleware" + + "github.com/gin-gonic/gin" +) + +/* +Register is a place to register rotes +*/ +func Register(router *gin.Engine) { + authMiddleware, err := middleware.NewAuthMiddleware() + if err != nil { + log.Panicln(err) + } + + router.POST("/login", handler.LoginHandler) + + auth := router.Group("/auth") + auth.Use(authMiddleware.MiddlewareFunc()) + { + auth.GET("/curriculums/semesters", handler.CurriculumHandler) + auth.GET("/curriculums/courses", handler.CoursesHandler) + } +} diff --git a/interface/controller/courses_controller.go b/interface/controller/courses_controller.go new file mode 100644 index 0000000..d122f00 --- /dev/null +++ b/interface/controller/courses_controller.go @@ -0,0 +1,83 @@ +package controller + +import ( + "errors" + "log" + "tat_gogogo/domain/model" + "tat_gogogo/domain/repository" + "tat_gogogo/domain/service" + "tat_gogogo/usecase" +) + +type coursesController struct { + studentID string + password string + targetStudentID string + year string + semester string +} + +/* +CoursesController handle courses +*/ +type CoursesController interface { + GetCurriculums() ([]model.Curriculum, error) + IsSameYearAndSem(curriculums []model.Curriculum) bool + GetInfoResult() (*model.Result, error) +} + +/* +NewCoursesController get a new CoursesController +*/ +func NewCoursesController(studentID, password, targetStudentID, year, semester string) CoursesController { + return &coursesController{ + studentID: studentID, + password: password, + targetStudentID: targetStudentID, + year: year, + semester: semester, + } +} + +/* +GetCurriculums get curriculum +*/ +func (c *coursesController) GetCurriculums() ([]model.Curriculum, error) { + curriculumResultRepo := repository.NewResultRepository() + curriculumResultService := service.NewResultService(curriculumResultRepo) + curriculumResultUsecase := usecase.NewResultUseCase(curriculumResultRepo, curriculumResultService) + + curriculumRsult, err := curriculumResultUsecase.CurriculumResultBy(c.studentID, c.targetStudentID) + if err != nil { + log.Panicln(err) + return nil, err + } + + if curriculums, ok := curriculumRsult.GetData().([]model.Curriculum); ok { + return curriculums, nil + } + + return nil, errors.New("failed to cast []model.Curriculum") +} + +/* +IsSameYearAndSem judge is the same year and semester +*/ +func (c *coursesController) IsSameYearAndSem(curriculums []model.Curriculum) bool { + curriculumRepo := repository.NewCurriculumRepository() + curriculumService := service.NewCurriculumService(curriculumRepo) + curriculumUsecase := usecase.NewCurriculumUseCase(curriculumRepo, curriculumService) + + return curriculumUsecase.IsSameYearAndSem(curriculums, c.year, c.semester) +} + +/* +GetInfoResult get info result +*/ +func (c *coursesController) GetInfoResult() (*model.Result, error) { + infoResultRepo := repository.NewResultRepository() + infoResultService := service.NewResultService(infoResultRepo) + infoResultUsecase := usecase.NewResultUseCase(infoResultRepo, infoResultService) + + return infoResultUsecase.InfoResultBy(c.studentID, c.targetStudentID, c.year, c.semester) +} diff --git a/interface/controller/curriculum_controller.go b/interface/controller/curriculum_controller.go new file mode 100644 index 0000000..f453680 --- /dev/null +++ b/interface/controller/curriculum_controller.go @@ -0,0 +1,43 @@ +package controller + +import ( + "tat_gogogo/domain/model" + "tat_gogogo/domain/repository" + "tat_gogogo/domain/service" + "tat_gogogo/usecase" +) + +type curriculumController struct { + studentID string + password string + targetStudentID string +} + +/* +CurriculumController handle curriculum flow +*/ +type CurriculumController interface { + GetCurriculumResult() (*model.Result, error) +} + +/* +NewCurriculumController get a new CurriculumController +*/ +func NewCurriculumController(studentID, password, targetStudentID string) CurriculumController { + return &curriculumController{ + studentID: studentID, + password: password, + targetStudentID: targetStudentID, + } +} + +/* +GetCurriculumResult get curriculum +*/ +func (c *curriculumController) GetCurriculumResult() (*model.Result, error) { + curriculumResultRepo := repository.NewResultRepository() + curriculumResultService := service.NewResultService(curriculumResultRepo) + curriculumResultUsecase := usecase.NewResultUseCase(curriculumResultRepo, curriculumResultService) + + return curriculumResultUsecase.CurriculumResultBy(c.studentID, c.targetStudentID) +} diff --git a/interface/controller/login_controller.go b/interface/controller/login_controller.go new file mode 100644 index 0000000..4cfdd60 --- /dev/null +++ b/interface/controller/login_controller.go @@ -0,0 +1,60 @@ +package controller + +import ( + "log" + "tat_gogogo/domain/model" + "tat_gogogo/domain/repository" + "tat_gogogo/domain/service" + "tat_gogogo/usecase" +) + +type loginController struct { + studentID string + password string +} + +/* +LoginController handle login related task +*/ +type LoginController interface { + Login() (*model.Result, error) + LoginCurriculum() (bool, error) +} + +/* +NewLoginController get a new LoginHandler +*/ +func NewLoginController(studentID, password string) LoginController { + return &loginController{ + studentID: studentID, + password: password, + } +} + +/* +Login will login the school system +*/ +func (c *loginController) Login() (*model.Result, error) { + loginResultRepo := repository.NewResultRepository() + loginResultService := service.NewResultService(loginResultRepo) + loginResultUsecase := usecase.NewResultUseCase(loginResultRepo, loginResultService) + + result, err := loginResultUsecase.LoginResult(c.studentID, c.password) + if err != nil { + log.Panicln(err) + return nil, err + } + + return result, nil +} + +/* +LoginCurriculum will login school curriculum system +*/ +func (c *loginController) LoginCurriculum() (bool, error) { + curriculumRepo := repository.NewCurriculumRepository() + curriculumService := service.NewCurriculumService(curriculumRepo) + curriculumUsecase := usecase.NewCurriculumUseCase(curriculumRepo, curriculumService) + + return curriculumUsecase.LoginCurriculum() +} diff --git a/interface/controllers/courses/courses.go b/interface/controllers/courses/courses.go deleted file mode 100644 index 73902f5..0000000 --- a/interface/controllers/courses/courses.go +++ /dev/null @@ -1,159 +0,0 @@ -package courses - -import ( - "log" - "tat_gogogo/domain/model" - "tat_gogogo/domain/repository" - "tat_gogogo/domain/service" - "tat_gogogo/usecase" - - "errors" - - "github.com/gin-gonic/gin" -) - -type handler struct { - studentID string - password string - targetStudentID string - year string - semester string -} - -/* -Controller is a function for gin to handle courses api -*/ -func Controller(c *gin.Context) { - studentID := c.PostForm("studentID") - password := c.PostForm("password") - targetStudentID := c.PostForm("targetStudentID") - year := c.PostForm("year") - semester := c.PostForm("semester") - - handler := newHandler(studentID, password, targetStudentID, year, semester) - - result, err := handler.login() - if err != nil { - c.Status(500) - return - } - - if !result.GetSuccess() { - c.JSON(401, gin.H{ - "message": result.GetData(), - }) - return - } - - isLoginCurriculumSuccess, err := handler.loginCurriculum() - if err != nil { - c.Status(500) - return - } - - if !isLoginCurriculumSuccess { - c.JSON(401, gin.H{ - "message": "登入課程系統失敗", - }) - return - } - - curriculums, err := handler.getCurriculums() - if err != nil { - c.Status(500) - return - } - - isSameYearAndSem := handler.isSameYearAndSem(curriculums) - - if !isSameYearAndSem { - result := getNoDataResult() - c.JSON(result.GetStatus(), gin.H{ - "message": result.GetData(), - }) - return - } - - infoResult, err := handler.getInfoResult() - if err != nil { - log.Panicln(err) - c.Status(500) - return - } - - c.JSON(infoResult.GetStatus(), infoResult.GetData()) - -} - -func newHandler(studentID, password, targetStudentID, year, semester string) *handler { - return &handler{ - studentID: studentID, - password: password, - targetStudentID: targetStudentID, - year: year, - semester: semester, - } -} - -func getNoDataResult() *model.Result { - resultRepo := repository.NewResultRepository() - resultService := service.NewResultService(resultRepo) - resultUsecase := usecase.NewResultUseCase(resultRepo, resultService) - return resultUsecase.GetNoDataResult() -} - -func (c *handler) login() (*model.Result, error) { - loginResultRepo := repository.NewResultRepository() - loginResultService := service.NewResultService(loginResultRepo) - loginResultUsecase := usecase.NewResultUseCase(loginResultRepo, loginResultService) - - result, err := loginResultUsecase.LoginResult(c.studentID, c.password) - if err != nil { - log.Panicln(err) - return nil, err - } - - return result, nil -} - -func (c *handler) loginCurriculum() (bool, error) { - curriculumRepo := repository.NewCurriculumRepository() - curriculumService := service.NewCurriculumService(curriculumRepo) - curriculumUsecase := usecase.NewCurriculumUseCase(curriculumRepo, curriculumService) - - return curriculumUsecase.LoginCurriculum() -} - -func (c *handler) getCurriculums() ([]model.Curriculum, error) { - curriculumResultRepo := repository.NewResultRepository() - curriculumResultService := service.NewResultService(curriculumResultRepo) - curriculumResultUsecase := usecase.NewResultUseCase(curriculumResultRepo, curriculumResultService) - - curriculumRsult, err := curriculumResultUsecase.CurriculumResultBy(c.studentID, c.targetStudentID) - if err != nil { - log.Panicln(err) - return nil, err - } - - if curriculums, ok := curriculumRsult.GetData().([]model.Curriculum); ok { - return curriculums, nil - } - - return nil, errors.New("failed to cast []model.Curriculum") -} - -func (c *handler) isSameYearAndSem(curriculums []model.Curriculum) bool { - curriculumRepo := repository.NewCurriculumRepository() - curriculumService := service.NewCurriculumService(curriculumRepo) - curriculumUsecase := usecase.NewCurriculumUseCase(curriculumRepo, curriculumService) - - return curriculumUsecase.IsSameYearAndSem(curriculums, c.year, c.semester) -} - -func (c *handler) getInfoResult() (*model.Result, error) { - infoResultRepo := repository.NewResultRepository() - infoResultService := service.NewResultService(infoResultRepo) - infoResultUsecase := usecase.NewResultUseCase(infoResultRepo, infoResultService) - - return infoResultUsecase.InfoResultBy(c.studentID, c.targetStudentID, c.year, c.semester) -} diff --git a/interface/controllers/curriculum/curriculum.go b/interface/controllers/curriculum/curriculum.go deleted file mode 100644 index 9d8f1df..0000000 --- a/interface/controllers/curriculum/curriculum.go +++ /dev/null @@ -1,101 +0,0 @@ -package curriculum - -import ( - "tat_gogogo/domain/model" - "tat_gogogo/domain/repository" - "tat_gogogo/domain/service" - "tat_gogogo/usecase" - - "log" - - "github.com/gin-gonic/gin" -) - -type handler struct { - studentID string - password string - targetStudentID string -} - -/* -Controller is a function for gin to handle curriculum api -*/ -func Controller(c *gin.Context) { - studentID := c.PostForm("studentID") - password := c.PostForm("password") - targetStudentID := c.PostForm("targetStudentID") - - handler := newHandler(studentID, password, targetStudentID) - - result, err := handler.login() - if err != nil { - c.Status(500) - return - } - - if !result.GetSuccess() { - c.JSON(401, gin.H{ - "message": result.GetData(), - }) - return - } - - isLoginCurriculumSuccess, err := handler.loginCurriculum() - if err != nil { - c.Status(500) - return - } - - if !isLoginCurriculumSuccess { - c.JSON(401, gin.H{ - "message": "登入課程系統失敗", - }) - return - } - - curriculumResult, err := handler.getCurriculumResult() - if err != nil { - c.Status(500) - return - } - - c.JSON(curriculumResult.GetStatus(), curriculumResult.GetData()) -} - -func newHandler(studentID, password, targetStudentID string) *handler { - return &handler{ - studentID: studentID, - password: password, - targetStudentID: targetStudentID, - } -} - -func (c *handler) login() (*model.Result, error) { - loginResultRepo := repository.NewResultRepository() - loginResultService := service.NewResultService(loginResultRepo) - loginResultUsecase := usecase.NewResultUseCase(loginResultRepo, loginResultService) - - result, err := loginResultUsecase.LoginResult(c.studentID, c.password) - if err != nil { - log.Panicln(err) - return nil, err - } - - return result, nil -} - -func (c *handler) loginCurriculum() (bool, error) { - curriculumRepo := repository.NewCurriculumRepository() - curriculumService := service.NewCurriculumService(curriculumRepo) - curriculumUsecase := usecase.NewCurriculumUseCase(curriculumRepo, curriculumService) - - return curriculumUsecase.LoginCurriculum() -} - -func (c *handler) getCurriculumResult() (*model.Result, error) { - curriculumResultRepo := repository.NewResultRepository() - curriculumResultService := service.NewResultService(curriculumResultRepo) - curriculumResultUsecase := usecase.NewResultUseCase(curriculumResultRepo, curriculumResultService) - - return curriculumResultUsecase.CurriculumResultBy(c.studentID, c.targetStudentID) -} diff --git a/interface/controllers/login/login.go b/interface/controllers/login/login.go deleted file mode 100644 index d4e19e5..0000000 --- a/interface/controllers/login/login.go +++ /dev/null @@ -1,40 +0,0 @@ -package login - -import ( - "tat_gogogo/domain/repository" - "tat_gogogo/domain/service" - "tat_gogogo/usecase" - - "log" - - "github.com/gin-gonic/gin" -) - -/* -Controller is a function for gin to handle login api -*/ -func Controller(c *gin.Context) { - studentID := c.PostForm("studentID") - password := c.PostForm("password") - - repo := repository.NewResultRepository() - service := service.NewResultService(repo) - resultUsecase := usecase.NewResultUseCase(repo, service) - result, err := resultUsecase.LoginResult(studentID, password) - - if err != nil { - log.Panicln("failed to fetch login cookie") - c.Status(500) - return - } - - if result.GetStatus() != 200 { - c.JSON(result.GetStatus(), gin.H{ - "message": result.GetData(), - }) - return - } - - c.Status(200) - -} diff --git a/interface/routes/router.go b/interface/routes/router.go deleted file mode 100644 index 8717d0e..0000000 --- a/interface/routes/router.go +++ /dev/null @@ -1,18 +0,0 @@ -package routes - -import ( - "tat_gogogo/interface/controllers/courses" - "tat_gogogo/interface/controllers/curriculum" - "tat_gogogo/interface/controllers/login" - - "github.com/gin-gonic/gin" -) - -/* -RegisterRoutes is a place to register rotes -*/ -func RegisterRoutes(router *gin.Engine) { - router.POST("/login", login.Controller) - router.POST("/curriculums", curriculum.Controller) - router.POST("/curriculums/courses", courses.Controller) -}