From c18fbc2f6f695aeeb79979194a3e7effee74fe28 Mon Sep 17 00:00:00 2001
From: sarifuddin <sarifuddin@kanosolution.com>
Date: Thu, 1 Sep 2022 09:27:48 +0700
Subject: [PATCH] add sync ticket kind

---
 .gitignore                       | 130 +++++++++++++++++++++++++++++--
 pkg/model/ticket-kind.go         |  40 ++++++++++
 pkg/repository/base.go           |  10 ++-
 pkg/repository/ticket_kind.go    |  18 +++++
 pkg/services/sync/base.go        |   1 +
 pkg/services/sync/ticket-kind.go | 103 ++++++++++++++++++++++++
 pkg/services/sync/ticket.go      |   6 --
 pkg/type/process/kind.go         |   5 +-
 8 files changed, 293 insertions(+), 20 deletions(-)
 create mode 100644 pkg/model/ticket-kind.go
 create mode 100644 pkg/repository/ticket_kind.go
 create mode 100644 pkg/services/sync/ticket-kind.go

diff --git a/.gitignore b/.gitignore
index 54f16d3..5890fed 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,9 +1,123 @@
-cmd/app/__debug_bin
-release/
-cmd/app/static/*
-cmd/app/__debug_bin.exe
-cmd/etl/__debug_bin.exe
-.ignored/
-.vscode/*.log
-config/*.yml
+# Workspace
+config/app.yaml
+config/app.yml
+config/caddyfile
+__debug_bin
+__debug_bin.exe
+NUL
+services/iam/sessions
+services/iam/sessions/*
+services/asset/files
+services/asset/files/*
+release
+scripts/**/*.out
+go.mod.backup
 
+
+# Created by .ignore support plugin (hsz.mobi)
+### Node template
+# Logs
+/logs
+*.log
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+
+# Runtime data
+pids
+*.pid
+*.seed
+*.pid.lock
+
+# Directory for instrumented libs generated by jscoverage/JSCover
+lib-cov
+
+# Coverage directory used by tools like istanbul
+coverage
+
+# nyc test coverage
+.nyc_output
+
+# Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files)
+.grunt
+
+# Bower dependency directory (https://bower.io/)
+bower_components
+
+# node-waf configuration
+.lock-wscript
+
+# Compiled binary addons (https://nodejs.org/api/addons.html)
+build/Release
+
+# Dependency directories
+node_modules/
+jspm_packages/
+
+# TypeScript v1 declaration files
+typings/
+
+# Optional npm cache directory
+.npm
+
+# Optional eslint cache
+.eslintcache
+
+# Optional REPL history
+.node_repl_history
+
+# Output of 'npm pack'
+*.tgz
+
+# Yarn Integrity file
+.yarn-integrity
+
+# dotenv environment variables file
+.env
+
+# parcel-bundler cache (https://parceljs.org/)
+.cache
+
+# next.js build output
+.next
+
+# nuxt.js build output
+.nuxt
+
+# Nuxt generate
+dist
+
+# vuepress build output
+.vuepress/dist
+
+# Serverless directories
+.serverless
+
+# IDE / Editor
+.idea
+
+# Service worker
+sw.*
+
+# macOS
+.DS_Store
+
+# Vim swap files
+*.swp
+
+ignored/
+tools/playground/**
+!tools/playground/.keep
+tools/migration/data/arbitrary-test.go
+services/account/account.exe
+services/asset/asset.exe
+services/config/config.exe
+services/event/event.exe
+services/iam/iam.exe
+services/notification/notification.exe
+services/payment/payment.exe
+sessions/5ecbda36-324c-4c86-90b8-23d73f823c19.json
+sessions/8b98f80e-955b-4cc1-9e11-9d1763b02058.json
+sessions/9f8a6a05-80ad-42d2-9e15-41f31c31a62b.json
+startdependency.bat
+startservice.bat
diff --git a/pkg/model/ticket-kind.go b/pkg/model/ticket-kind.go
new file mode 100644
index 0000000..5038f2d
--- /dev/null
+++ b/pkg/model/ticket-kind.go
@@ -0,0 +1,40 @@
+package model
+
+import (
+	"fmt"
+
+	"git.kanosolution.net/kano/dbflex"
+	"git.kanosolution.net/kano/dbflex/orm"
+)
+
+type TicketKindMaster struct {
+	orm.DataModelBase `json:"-"`
+	ID                string  `json:"_id"`
+	EventID           string  `json:"event_id"`
+	Name              string  `json:"name"`
+	Description       string  `json:"description"`
+	Visibility        string  `json:"visibility"`
+	Price             float64 `json:"price"`
+}
+
+func (o *TicketKindMaster) TableName() string {
+	return "ticket_kinds"
+}
+
+func (o *TicketKindMaster) GetID(_ dbflex.IConnection) ([]string, []interface{}) {
+	return []string{"_id"}, []interface{}{o.ID}
+}
+
+func (o *TicketKindMaster) SetID(keys ...interface{}) {
+	if len(keys) > 0 {
+		o.ID = keys[0].(string)
+	}
+}
+
+func (o *TicketKindMaster) PreSave(dbflex.IConnection) error {
+	if o.ID == "" {
+		return fmt.Errorf("ID of ticket kind model not allowed null/empty")
+	}
+
+	return nil
+}
diff --git a/pkg/repository/base.go b/pkg/repository/base.go
index 67ca249..e215db2 100644
--- a/pkg/repository/base.go
+++ b/pkg/repository/base.go
@@ -11,10 +11,11 @@ var (
 	Hub *datahub.Hub
 
 	//repository list
-	TicketRepo   TicketRepository
-	CheckinRepo  CheckinRepository
-	ChecklogRepo ChecklogRepository
-	ProcessRepo  ProcessLockRepository
+	TicketRepo     TicketRepository
+	CheckinRepo    CheckinRepository
+	ChecklogRepo   ChecklogRepository
+	ProcessRepo    ProcessLockRepository
+	TicketKindRepo TicketKindRepository
 )
 
 type RepositoryInitParam struct {
@@ -37,6 +38,7 @@ func SetMGORepository() {
 	CheckinRepo = &CheckinMgo{}
 	ChecklogRepo = &ChecklogMgo{}
 	ProcessRepo = &ProcessLockMgo{}
+	TicketKindRepo = &TicketKindMgo{}
 }
 
 type Paggination struct {
diff --git a/pkg/repository/ticket_kind.go b/pkg/repository/ticket_kind.go
new file mode 100644
index 0000000..1837ebe
--- /dev/null
+++ b/pkg/repository/ticket_kind.go
@@ -0,0 +1,18 @@
+package repository
+
+import "git.kanosolution.net/expo/ticket-scanner/pkg/model"
+
+type TicketKindRepository interface {
+	Save(ticketKind *model.TicketKindMaster) error
+}
+
+type TicketKindMgo struct{}
+
+func (o *TicketKindMgo) Save(ticketKind *model.TicketKindMaster) error {
+	e := Hub.Save(ticketKind)
+	if e != nil {
+		return e
+	}
+
+	return nil
+}
diff --git a/pkg/services/sync/base.go b/pkg/services/sync/base.go
index 2bc8a49..fbf4e22 100644
--- a/pkg/services/sync/base.go
+++ b/pkg/services/sync/base.go
@@ -19,6 +19,7 @@ func StartScheduler(s *kaos.Service, minutes int) {
 	etlProcess := []IETL{
 		NewTicket(nil),
 		NewCheckin(nil),
+		NewTicketKind(nil),
 	}
 
 	scheduler := cron.New(cron.WithChain(
diff --git a/pkg/services/sync/ticket-kind.go b/pkg/services/sync/ticket-kind.go
new file mode 100644
index 0000000..ed6c008
--- /dev/null
+++ b/pkg/services/sync/ticket-kind.go
@@ -0,0 +1,103 @@
+package sync
+
+import (
+	"git.kanosolution.net/expo/ticket-scanner/pkg/helper"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/lib"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/lib/logger"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/lib/rest"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/model"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/repository"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/services"
+	"git.kanosolution.net/expo/ticket-scanner/pkg/type/process"
+	"github.com/eaciit/toolkit"
+)
+
+type TicketKind struct {
+	log      *toolkit.LogEngine
+	syncKind process.Kind
+}
+
+func NewTicketKind(log *toolkit.LogEngine) *TicketKind {
+	ticketKind := &TicketKind{
+		log:      log,
+		syncKind: process.SyncTicketKind,
+	}
+
+	if ticketKind.log == nil {
+		ticketKind.log = logger.LogWithPrefix(ticketKind.Tag())
+	}
+
+	return ticketKind
+}
+
+type TicketKindSyncResponse struct {
+	Data  []model.TicketKindMaster `json:"data"`
+	Total int                      `json:"total"`
+}
+
+func (o *TicketKind) Sync(eventID string) error {
+	//get all ticket kind by event id
+	processLock := services.NewProcessLock(eventID, o.syncKind)
+	if true == processLock.IsRunning() {
+		processLock.UpdateStatus(process.Skip, "Proses sync ticket masih berjalan, mohon tunggu beberapa saat lagi")
+		return nil
+	}
+
+	var e error
+	e = processLock.Start()
+	if e != nil {
+		return e
+	}
+
+	defer func() {
+		err := processLock.Stop(e)
+		if err != nil {
+			o.log.Error(err.Error())
+		}
+
+		return
+	}()
+
+	var totalTicketKindSync int
+	e = helper.PanicHandler(func() error {
+		o.log.Info("Start Sync")
+		defer func() {
+			o.log.Infof("End Sync with total data: %d", totalTicketKindSync)
+		}()
+
+		//get count of data by last refresh date
+		baseURL := lib.AppConfig().Data.GetString("evensio_base_url")
+		rest := rest.New(baseURL)
+
+		ticketKindGetsParam := toolkit.M{
+			"event_id": eventID,
+		}
+
+		res := new(TicketKindSyncResponse)
+		output, e := rest.Post("/ticket/scanner/getsticketkind", ticketKindGetsParam, res)
+
+		if e != nil {
+			o.log.Errorf("Failed when gets ticket kind with response %s and error: %s", string(output), e.Error())
+			return e
+		}
+
+		//starting store ticket kind to internal db ticket scanner
+		for _, ticketKind := range res.Data {
+			e = repository.TicketKindRepo.Save(&ticketKind)
+			if e != nil {
+				return e
+			}
+		}
+		return nil
+	}, *o.log)
+
+	if e != nil {
+		return e
+	}
+
+	return nil
+}
+
+func (o *TicketKind) Tag() string {
+	return "ticket_kind_sync"
+}
diff --git a/pkg/services/sync/ticket.go b/pkg/services/sync/ticket.go
index b9ccdbf..0d3e74f 100644
--- a/pkg/services/sync/ticket.go
+++ b/pkg/services/sync/ticket.go
@@ -135,12 +135,6 @@ func (o *Ticket) Sync(eventID string) error {
 				}
 			}
 
-			return nil
-
-			if e != nil {
-				return e
-			}
-
 			iteration++
 			if iteration > fetchIteration {
 				break
diff --git a/pkg/type/process/kind.go b/pkg/type/process/kind.go
index 10ec717..4e75caa 100644
--- a/pkg/type/process/kind.go
+++ b/pkg/type/process/kind.go
@@ -3,6 +3,7 @@ package process
 type Kind string
 
 const (
-	SyncTicket  Kind = "sync_ticket"
-	SyncCheckin Kind = "sync_checkin"
+	SyncTicket     Kind = "sync_ticket"
+	SyncTicketKind Kind = "sync_ticket_kind"
+	SyncCheckin    Kind = "sync_checkin"
 )
-- 
GitLab