Project: alvinjo15/api_Marketing Commit: a6253a76c55f896d8abae3adf000e81ad295145f Message: enrico 15.48 --- files/etc/skeleton/skeleton.development.yaml --- @@ -1,6 +1,6 @@ server: port: ":8888" database: - master: "root:@tcp(localhost:3306)/test" + master: "spetnaz:sp3tn4z2019@tcp(34.87.44.167)/upload-download-vb?parseTime=true" api: \ No newline at end of file --- go.mod --- @@ -9,5 +9,6 @@ require ( github.com/pkg/errors v0.9.1 github.com/stretchr/testify v1.5.1 google.golang.org/appengine v1.6.5 // indirect + gopkg.in/guregu/null.v3 v3.4.0 gopkg.in/yaml.v2 v2.2.8 ) --- go.mod298498081.tmp --- @@ -0,0 +1,14 @@ +module go-skeleton + +go 1.13 + +require ( + github.com/go-sql-driver/mysql v1.4.0 + github.com/gorilla/mux v1.7.4 + github.com/jmoiron/sqlx v1.2.0 + github.com/pkg/errors v0.9.1 + github.com/stretchr/testify v1.5.1 + google.golang.org/appengine v1.6.5 // indirect + gopkg.in/guregu/null.v3 v3.4.0 + gopkg.in/yaml.v2 v2.2.8 +) --- go.mod427131847.tmp --- @@ -0,0 +1,14 @@ +module go-skeleton + +go 1.13 + +require ( + github.com/go-sql-driver/mysql v1.4.0 + github.com/gorilla/mux v1.7.4 + github.com/jmoiron/sqlx v1.2.0 + github.com/pkg/errors v0.9.1 + github.com/stretchr/testify v1.5.1 + google.golang.org/appengine v1.6.5 // indirect + gopkg.in/guregu/null.v3 v3.4.0 + gopkg.in/yaml.v2 v2.2.8 +) --- go.sum --- @@ -28,6 +28,8 @@ google.golang.org/appengine v1.6.5 h1:tycE03LOZYQNhDpS27tcQdAzLCVMaj7QT2SXxebnpC google.golang.org/appengine v1.6.5/go.mod h1:8WjMMxjGQR8xUklV/ARdw2HLXBOI7O7uCIDZVag1xfc= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM= gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0= +gopkg.in/guregu/null.v3 v3.4.0 h1:AOpMtZ85uElRhQjEDsFx21BkXqFPwA7uoJukd4KErIs= +gopkg.in/guregu/null.v3 v3.4.0/go.mod h1:E4tX2Qe3h7QdL+uZ3a0vqvYwKQsRSQKM5V4YltdgH9Y= gopkg.in/yaml.v2 v2.2.2/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= gopkg.in/yaml.v2 v2.2.8 h1:obN1ZagJSUGI0Ek/LBmuj4SNLPfIny3KsKFopxRdj10= gopkg.in/yaml.v2 v2.2.8/go.mod h1:hI93XBmqTisBFMUTm0b8Fm+jr3Dg1NNxqwp+5A1VGuI= --- internal/config/config.go --- @@ -52,7 +52,7 @@ func WithConfigFile(file string) Option { func getDefaultConfigFile() string { var ( repoPath = filepath.Join(os.Getenv("GOPATH"), "src/go-skeleton") - configPath = filepath.Join(repoPath, "files/etc/skeleton/skeleton.environment.yaml") + configPath = filepath.Join(repoPath, "files/etc/skeleton/skeleton.development.yaml") env = os.Getenv("ENV") ) --- internal/data/skeleton/skeleton.go --- @@ -2,6 +2,8 @@ package skeleton import ( "context" + SkelEntity "go-skeleton/internal/entity/skeleton" + "go-skeleton/pkg/errors" "log" "github.com/jmoiron/sqlx" @@ -24,14 +26,23 @@ type ( // Tambahkan query di dalam const // getAllUser = "GetAllUser" // qGetAllUser = "SELECT * FROM users" -const () +const ( + getItemPromo = "GetItemPromo" + qGetItemPromo = "SELECT * FROM m_itempromo" + + getAllBuyingFocus = "GetAllBuyingFocus" + qGetAllBuyingFocus = "SELECT *FROM buying_focus" +) // Tambahkan query ke dalam key value order agar menjadi prepared statements // readStmt = []statement{ // {getAllUser, qGetAllUser}, // } var ( - readStmt = []statement{} + readStmt = []statement{ + {getItemPromo, qGetItemPromo}, + {getAllBuyingFocus, qGetAllBuyingFocus}, + } ) // New ... @@ -59,3 +70,50 @@ func (d *Data) initStmt() { d.stmt = stmts } + +// GetItemPromo .. +func (d Data) GetItemPromo(ctx context.Context) ([]SkelEntity.ItemPromo, error) { + var ( + promoItem SkelEntity.ItemPromo + promoItems []SkelEntity.ItemPromo + err error + ) + + rows, err := d.stmt[getItemPromo].QueryxContext(ctx) + + // Looping seluruh row data + for rows.Next() { + // Insert row data ke struct user + if err := rows.StructScan(&promoItem); err != nil { + return promoItems, errors.Wrap(err, "[DATA][GetItemPromo] ") + } + // Tambahkan struct user ke array user + promoItems = append(promoItems, promoItem) + } + // Return users array + return promoItems, err +} + +// GetAllBuyingFocus ... +func (d Data) GetAllBuyingFocus(ctx context.Context) ([]SkelEntity.Buyingfocus, error) { + var ( + bf SkelEntity.Buyingfocus + bfs []SkelEntity.Buyingfocus + err error + ) + + // Query ke database + rows, err := d.stmt[getAllBuyingFocus].QueryxContext(ctx) + + // Looping seluruh row data + for rows.Next() { + // Insert row data ke struct user + if err := rows.StructScan(&bf); err != nil { + return bfs, errors.Wrap(err, "[DATA][GetAllBuyingFocus]") + } + // Tambahkan struct user ke array user + bfs = append(bfs, bf) + } + // Return users array + return bfs, err +} --- internal/delivery/http/handler.go --- @@ -17,7 +17,7 @@ func (s *Server) Handler() *mux.Router { r.NotFoundHandler = http.HandlerFunc(notFoundHandler) // Tambahan Prefix di depan API endpoint router := r.PathPrefix("").Subrouter() - router.HandleFunc("/skeleton", s.Skeleton.SkeletonHandler).Methods("GET") + router.HandleFunc("/users", s.Skeleton.SkeletonHandler).Methods("GET") return r } --- internal/delivery/http/skeleton/skeleton.go --- @@ -1,17 +1,23 @@ package skeleton import ( + "encoding/json" "errors" + "io/ioutil" "log" "net/http" "strings" + "context" + SkelEntity "go-skeleton/internal/entity/skeleton" "go-skeleton/pkg/response" ) // ISkeletonSvc is an interface to Skeleton Service // Masukkan function dari service ke dalam interface ini type ISkeletonSvc interface { + GetItemPromo(ctx context.Context) ([]SkelEntity.ItemPromo, error) + GetAllBuyingFocus(ctx context.Context) ([]SkelEntity.Buyingfocus, error) } type ( @@ -31,19 +37,37 @@ func New(is ISkeletonSvc) *Handler { // SkeletonHandler will receive request and return response func (h *Handler) SkeletonHandler(w http.ResponseWriter, r *http.Request) { var ( - resp *response.Response - result interface{} - metadata interface{} - err error - errRes response.Error + resp *response.Response + result interface{} + metadata interface{} + err error + errRes response.Error + ItemPromo SkelEntity.ItemPromo + BuyingFocus SkelEntity.Buyingfocus ) resp = &response.Response{} defer resp.RenderJSON(w, r) + body, _ := ioutil.ReadAll(r.Body) switch r.Method { // Check if request method is GET case http.MethodGet: + var _type string + + if _, getOK := r.URL.Query()["Get"]; getOK { + _type = r.FormValue("Get") + } + + switch _type { + case "ItemPromo": + json.Unmarshal(body, &ItemPromo) + result, err = h.skeletonSvc.GetItemPromo(context.Background()) + + case "BuyingFocus": + json.Unmarshal(body, &BuyingFocus) + result, err = h.skeletonSvc.GetAllBuyingFocus(context.Background()) + } // Check if request method is POST case http.MethodPost: --- internal/entity/skeleton/skeleton.go --- @@ -1,8 +1,44 @@ package skeleton -// Skeleton model -type Skeleton struct { - SkeletonID int `db:"skeleton_id" json:"skeleton_id"` - SkeletonName int `db:"skeleton_name" json:"skeleton_name"` - DarrenGanteng string `db:"skeleton_ganteng" json: "ganteng_banget` +import ( + "time" + + "gopkg.in/guregu/null.v3/zero" +) + +// ItemPromo model +type ItemPromo struct { + PromoRunningID zero.Int `db:"promo_runningid" json:"promo_runningid"` + PromoCode zero.String `db:"promo_code" json:"promo_code"` + PromoName zero.String `db:"promo_name" json:"promo_name"` + PromoSpaceYN zero.String `db:"promo_spaceyn" json:"promo_spaceyn"` + PromoAllOutletYN zero.String `db:"promo_alloutletyn" json:"promo_alloutletyn"` + LastUpdate time.Time `db:"lastupdate" json:"lastupdate"` + Host zero.String `db:"host" json:"host"` + Pph zero.Float `db:"pph" json:"pph"` + PromoEdlpYN zero.String `db:"promo_edlpyn" json:"promo_edlpyn"` + PromoTipeBayar zero.Int `db:"promo_tipebayar" json:"promo_tipebayar"` + PromoLeadTime zero.Int `db:"promo_leadtime" json:"promo_leadtime"` + PromoDept zero.String `db:"promo_dept" json:"promo_dept"` + PromoAlokasiYN zero.String `db:"promo_alokasiyn" json:"promo_alokasiyn"` + PromoActiveYN zero.String `db:"promo_activeyn" json:"promo_activeyn"` +} + +// BuyingFocus model ... +type Buyingfocus struct { + LtrID zero.String `db:"ltr_id" json:"ltr_id"` + PromoCode zero.String `db:"promo_code" json:"promo_code"` + PkProduct zero.String `db:"pk_product" json:"pk_product"` + PkID zero.Int `db:"pkid" json:"pkid"` + Prdaw zero.String `db:"prdaw" json:"prdaw"` + Prdak zero.String `db:"prdak" json:"prdak"` + JnsTarget zero.Int `db:"jnstarget" json:"jnstarget"` + JnsSatuanr zero.Int `db:"jnssatuanr" json:"jnssatuanr"` + JnsSatuani zero.Int `db:"jnssatuani" json:"jnssatuani"` + JnsProgram zero.Int `db:"jnsprogram" json:"jnsprogram"` + SalesAwal zero.Float `db:"sales_awal" json:"sales_awal"` + SalesAkhir zero.Float `db:"sales_akhir" json:"sales_akhir"` + Insentif zero.Float `db:"insentif" json:"insentif"` + Tambah zero.Int `db:"tambah" json:"tambah"` + LtrSupcode zero.String `db:"ltr_supcode" json:"ltr_supcode"` } --- internal/service/skeleton/skeleton.go --- @@ -1,8 +1,16 @@ package skeleton +import ( + "context" + SkelEntity "go-skeleton/internal/entity/skeleton" + "go-skeleton/pkg/errors" +) + // Data ... // Masukkan function dari package data ke dalam interface ini type Data interface { + GetItemPromo(ctx context.Context) ([]SkelEntity.ItemPromo, error) + GetAllBuyingFocus(ctx context.Context) ([]SkelEntity.Buyingfocus, error) } // Service ... @@ -19,3 +27,27 @@ func New(data Data) Service { data: data, } } + +//GetAllBuyingFocus ... +func (s Service) GetAllBuyingFocus(ctx context.Context) ([]SkelEntity.Buyingfocus, error) { + // Panggil method GetAllUsers di data layer user + skeleton, err := s.data.GetAllBuyingFocus(ctx) + // Error handling + if err != nil { + return skeleton, errors.Wrap(err, "[SERVICE][GetAllBuyingFocus]") + } + // Return users array + return skeleton, err +} + +// GetItemPromo .. +func (s Service) GetItemPromo(ctx context.Context) ([]SkelEntity.ItemPromo, error) { + // Panggil method GetItemPromo di data layer user + skeleton, err := s.data.GetItemPromo(ctx) + // Error handling + if err != nil { + return skeleton, errors.Wrap(err, "[SERVICE][GetItemPromo]") + } + // Return users array + return skeleton, err +}