diff --git a/Makefile b/Makefile index 0dce9f5..126bf3a 100644 --- a/Makefile +++ b/Makefile @@ -14,3 +14,6 @@ test: server: . ./tools/export-env.sh ; go run ./src/. + +seed: + . ./tools/export-env.sh ; go run ./src/. seed \ No newline at end of file diff --git a/README.md b/README.md index f813ad7..b14312e 100644 --- a/README.md +++ b/README.md @@ -30,6 +30,9 @@ Johnjud is a pet adoption web application of the [CUVET For Animal Welfare Club] 1. Run `docker-compose up -d` 2. Run `make server` or `go run ./src/.` +### Data Seeding +1. Run `make seed` or `. ./tools/export-env.sh ; go run ./src/. seed` + ### Testing 1. Run `make test` or `go test -v -coverpkg ./... -coverprofile coverage.out -covermode count ./...` diff --git a/go.mod b/go.mod index 6596041..c9c1cc4 100644 --- a/go.mod +++ b/go.mod @@ -8,6 +8,7 @@ require ( github.com/bxcodec/faker/v3 v3.8.1 github.com/google/uuid v1.5.0 github.com/isd-sgcu/johnjud-go-proto v0.5.2 + github.com/pkg/errors v0.9.1 github.com/rs/zerolog v1.31.0 github.com/spf13/viper v1.18.1 github.com/stretchr/testify v1.8.4 diff --git a/go.sum b/go.sum index 34dd02e..975bf5b 100644 --- a/go.sum +++ b/go.sum @@ -49,6 +49,7 @@ github.com/mitchellh/mapstructure v1.5.0 h1:jeMsZIYE/09sWLaz43PL7Gy6RuMjD2eJVyua github.com/mitchellh/mapstructure v1.5.0/go.mod h1:bFUtVrKA4DC2yAKiSyO/QUcy7e+RRV2QTWOzhPopBRo= github.com/pelletier/go-toml/v2 v2.1.0 h1:FnwAJ4oYMvbT/34k9zzHuZNrhlz48GB3/s6at6/MHO4= github.com/pelletier/go-toml/v2 v2.1.0/go.mod h1:tJU2Z3ZkXwnxa4DPO899bsyIoywizdUvyaeZurnPPDc= +github.com/pkg/errors v0.9.1 h1:FEBLx1zS214owpjy7qsBeixbURkuhQAwrK5UwLGTwt4= github.com/pkg/errors v0.9.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/pmezard/go-difflib v1.0.1-0.20181226105442-5d4384ee4fb2 h1:Jamvg5psRIccs7FGNTlIRMkT8wgtp5eCXdBlqhYGL6U= diff --git a/src/app/repository/pet/pet.repository.go b/src/app/repository/pet/pet.repository.go index 0f72ae1..6bb59b1 100644 --- a/src/app/repository/pet/pet.repository.go +++ b/src/app/repository/pet/pet.repository.go @@ -1,6 +1,8 @@ package pet import ( + "errors" + "github.com/isd-sgcu/johnjud-backend/src/app/model/pet" "gorm.io/gorm" ) @@ -30,5 +32,13 @@ func (r *Repository) Update(id string, result *pet.Pet) error { } func (r *Repository) Delete(id string) error { - return r.db.Where("id = ?", id).Delete(&pet.Pet{}).Error + var pet pet.Pet + err := r.db.Where("id = ? AND deleted_at IS NULL", id).First(&pet).Error + if err != nil { + if errors.Is(err, gorm.ErrRecordNotFound) { + return gorm.ErrRecordNotFound + } + return err + } + return r.db.Delete(&pet).Error } diff --git a/src/database/seeds/1705074984036-pet.seed.go b/src/database/seeds/1705074984036-pet.seed.go new file mode 100644 index 0000000..f6ff025 --- /dev/null +++ b/src/database/seeds/1705074984036-pet.seed.go @@ -0,0 +1,12 @@ +package seed + +func (s Seed) PetSeed1705074984036() error { + for _, b := range pets { + err := s.db.Save(&b).Error + + if err != nil { + return err + } + } + return nil +} diff --git a/src/database/seeds/1705075734828-user.seed.go b/src/database/seeds/1705075734828-user.seed.go new file mode 100644 index 0000000..c75f1f6 --- /dev/null +++ b/src/database/seeds/1705075734828-user.seed.go @@ -0,0 +1,25 @@ +package seed + +import ( + "github.com/isd-sgcu/johnjud-backend/src/app/model/user" + + "github.com/bxcodec/faker/v3" +) + +func (s Seed) UserSeed1705075734828() error { + for i := 0; i < 3; i++ { + usr := user.User{ + Email: faker.Email(), + Password: faker.Password(), + Firstname: faker.FirstName(), + Lastname: faker.LastName(), + Role: "admin", + } + err := s.db.Create(&usr).Error + + if err != nil { + return err + } + } + return nil +} diff --git a/src/database/seeds/constant.seed.go b/src/database/seeds/constant.seed.go new file mode 100644 index 0000000..1b60725 --- /dev/null +++ b/src/database/seeds/constant.seed.go @@ -0,0 +1,266 @@ +package seed + +import ( + "github.com/isd-sgcu/johnjud-backend/src/app/model/pet" + constant "github.com/isd-sgcu/johnjud-backend/src/constant/pet" +) + +var pets = []pet.Pet{ + { + Type: "แมว", + Name: "เต้าเจี้ยว", + Birthdate: "2023-07-04 00:00:00.000000", + Gender: constant.MALE, + Color: "ครีม", + Habit: "ขี้อ้อน ชอบนั่งตัก ติดคน", + Caption: "สวัสดีฮะ ผมชื่อเต้าเจี้ยวเป็นแมวจากร้านข้าวมันไก่ เป็นพี่น้องซีอิ้ว เดิมผมอยู่กับคุณป้าร้านข้าวมันไก่ มีคุณป้าคอยให้อาหาร กินอาหารเม็ดบ้าง เศษไก่ เศษข้าวบ้าง จนพี่ๆจากชมรมมาเจอและขอพาผมไปทำหมัน ตอนนี้ผมเลยได้มาอยู่ในชมรม รอใครสักคนมารับผมกลับบ้าน ผมกลัวพี่แมวตัวใหญ่ในชมรมนิดหน่อย ทำให้ไม่ค่อยได้เลยกับพี่ทีมงานเท่าที่ควร แต่จริงๆแล้วผมเป็นแมวขี้เล่นและขี้อ้อนมากนะ สนใจรับผมไปอยู่บ้านด้วยกันมั้ยครับ", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "ซีอิ๊ว", + Birthdate: "2023-07-04 00:00:00.000000", + Gender: constant.FEMALE, + Color: "ดำ", + Habit: "ขี้อ้อน ขี้กลัว", + Caption: "หนูชื่อซีอิ๊ว ที่ได้ชื่อนี้เพราะหนูมาจากร้านข้าวมันไก่ ตอนแรกหนูมีคุณป้าร้านข้าวมันไก่คอยให้ข้าวให้น้ำ และให้ที่หลบรถและคนน่ากลัวอยู่หลังร้านของคุณป้า จนหนูถูกพามาทำหมันและได้มาอยู่ในชมรม หนูยังคงเป็นแมวขี้ระแวง ไว้ใจแค่เต้าเจี้ยวและพี่ทีมงานบ้างคน ถึงหนูจะขี้ระแวงแต่หนูก็ไม่เคยกัดหรือข่วนใคร ยิ่งกับคนที่หนูไว้ใจหนูจะขี้อ้อนมากๆเลยนะ อยากเล่นด้วยและอยากได้รับความรักอยู่ตลอด", + Status: constant.FINDHOME, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "พัดพา", + Birthdate: "2023-06-18 00:00:00.000000", + Gender: constant.FEMALE, + Color: "เทา", + Habit: "ติดคน ชอบคน ขี้อ้อนมาก ชอบนั่งตัก", + Caption: "ในวันที่ลมพัดแรงและฝนกำลังจะตกอย่างหนัก ผมแมวจรที่กำลังวิ่งหาที่หลบฝนอยู่ จนได้ไปหลบที่พุ่มไม้บริเวณคณะสัตวแพทย์ วันนั้นผมเตรียมใจแล้วว่าจะต้องโดนฝนและเปียกแน่ๆ กลายเป็นว่าวันนั้น ผมไม่ได้เปียกอย่างที่คาด เพราะมีพี่ชมรมคนนึงผ่านมาเห็นผม และอุ้มผมไปหลบฝน พร้อมกับโอบกอดผมเอาไว้อย่างอบอุ่น และเป็นสาเหตุที่ทำให้ผมได้ชื่อใหม่ว่า ’พัดพา’", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "โอริโอ้", + Birthdate: "2022-12-20 00:00:00.000000", + Gender: constant.MALE, + Color: "ดำ", + Habit: "ซน เล่นแรง กอดได้", + Caption: "ผมชื่อโอริโอ้ เป็นแมวจากตลาดสามย่าน ผมเคยได้บ้านไปแล้ว แต่เนื่องจากเหตุผลจำเป็นทำให้คุณแม่คนเดิมของผมไม่สามารถดูแลผมต่อได้ ผมเลยต้องกลับมาอยู่ที่ชมรมอีกครั้ง ผมเป็นเด็กดีนะ ร่าเริง ขี้เล่น และแข็งแรงเหมือนแมวปกติทั่วไป ถึงจะเข้าใจแต่ก็อดเสียใจไม่ได้ที่ต้องกลับมาเป็นแมวไม่มีเจ้าของอีกครั้ง จะมีอีกมั้ยโอกาสครั้งที่2 ที่จะมีคนมาให้ความรักแมวดำตัวอ้วนๆตัวนี้", + Status: constant.FINDHOME, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "แม่พลอย", + Birthdate: "2017-07-18 00:00:00.000000", + Gender: constant.FEMALE, + Color: "เทา", + Habit: "เข้ากับแมวตัวอื่นได้ดี เรียบร้อย", + Caption: "แม่พลอย แมวจรบริเวณสะพานลอยสยาม เดิมทีหนูเป็นแมวจรใช้ชีวิต หลบฝน หลบรถ และหากินเองข้างนอก จนวันหนึ่งต่อมก้นหนูอักเสบและเป็นแผล ทางชมรมจึงพาหนูมารักษาและหาหมอ ปัจจุบันหนูหายดีแล้ว แต่เพราะระยะเวลาการรักษาที่นาน บวกกับมีแมวเจ้าถิ่นตัวใหม่ ทำให้หนูไม่สามารถกลับไปใช้ชีวิตที่เดิมได้อีกแล้ว ตอนนี้หนูชินที่จะอยู่ในห้อง เรียนรู้ที่จะมีความสุขกับการนอนบนผ้านิ่มๆ ฝนเล็บกับกล่องลัง และส่งสายตาอ้อนให้พี่ทีมงานลูบหัวในทุกๆวัน", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "แมงมุม", + Birthdate: "2023-09-06 00:00:00.000000", + Gender: constant.MALE, + Color: "น้ำตาล", + Habit: "ขี้เล่น ร่าเริง ชอบของเล่น", + Caption: "ผมเป็นลูกแมวที่ถูกช่วยมาจากบริเวณสยาม ที่ได้ชื่อว่าแมงมุมก็เพราะนิสัยที่ชอบนอนบนหลังคากระบะทรายและหลังคากรงของผม ตอนอยู่กับคนผมเป็นแมวขี้อ้อน และตอนอยู่กับเพื่อนๆแมวผมก็เป็นแมวขี้เล่น สดใส ซนตามวัย ตอนนี้เพื่อนแมวหลายตัวค่อยๆทยอยได้บ้านกันไป เหลือก็แต่ผมที่ยังคงนั่งนับวันรอ เมื่อไหร่นะจะมีคนมาหลงรักและพาผมไปอยู่ด้วยกันบ้าง", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "ลูกหม่อน", + Birthdate: "2023-08-18 00:00:00.000000", + Gender: constant.FEMALE, + Color: "น้ำตาล", + Habit: "ขี้อ้อนมาก ติดคน ชอบร้องเรียกคน ฉลาด ซนตามวัย", + Caption: "“ลูกหม่อน” หรือ “มอลลี่” ถูกพบบริเวณพุ่มไม้หน้าตึกคณะอักษร จุฬาฯ วันแรกที่เจอกัน ทั้งเนื้อทั้งตัวมอมแมมและมีหมัดเต็มไปหมด การพบกันครั้งแรกของพวกเราไม่ค่อยดีเท่าไรค่ะเพราะลูกหม่อนเอาแต่ขู่เพราะกลัว ณ ตอนนั้นทางชมรมไม่มีที่แม้แต่จะเลี้ยงลูกแมวตัวน้อย 1 ตัว เพราะชมรมเราก็มีแมวมากมายที่รอหาบ้าน จึงต้องทำการฝากทางพี่แม่บ้านอักษรดูแล ต้องขอบคุณพี่ ๆ ที่ดูแลหนูอย่างดีนะคะ พอถึงเวลาลูกหม่อนก็ได้ย้ายมาอยู่ภายใต้การดูแลของชมรม ลูกหม่อนเริ่มอ้อนขึ้น ติดคนขึ้นมาก การที่ได้เห็นการเปลี่ยนแปลงของลูกแมวตัวน้อย ๆ ค่อย ๆ เติบโตขึ้นทุกวันเป็นอะไรที่น่าปลื้มใจมากค่ะ จากใจพี่เลี้ยงเจ้าลูกหม่อนอยู่ช่วงหนึ่ง ความหวังอันสูงสุดที่พวกเราเฝ้าภาวนาให้แมวในชมรมทุกวันคือขอให้แมวทุกตัวในชมรมได้ไปอยู่บ้านที่อบอุ่น มีคนพร้อมรับอุปการะและให้ความรักแมวจรตาแป๋ว ๆ พวกนี้ จนถึงช่วงชีวิตสุดท้ายของพวกเขา ลูกหม่อนก็เป็นหนึ่งในนั้นค่ะ ขอฝากเอ็นดูเจ้าลูกหม่อนไว้ในอ้อมอกอ้อมใจทุกคนด้วยนะคะ ขอให้ได้บ้านไวๆ นะลูกหม่อน💖", + Status: constant.FINDHOME, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "ซาบะ", + Birthdate: "2023-06-18 00:00:00.000000", + Gender: constant.FEMALE, + Color: "เทา", + Habit: "เรียบร้อย นิ่ง ขี้อ้อน ไม่โวยวาย", + Caption: "หนูชื่อ ซาบะ แมวจรบริเวณ CU Terrace เพราะหนูเกิดเป็นแมวจร จึงหลีกเลี่ยงไม่ได้ที่จะต้องดิ้นรน ต่อสู้ แย่งอาหาร เพื่อที่จะมีชีวิตต่อ แต่การใช้ชีวิตอย่างนั้นกลับทำให้หนูติดเชื้อไวรัส FIV โดยไม่รู้ตัว ตอนนี้หนูมาอยู่กับพี่ ๆ ในชมรม มีพี่ ๆ มาเล่นด้วย มามอบความรักให้หนู ด้วยข้อจำกัดที่ว่าต้องป้องกันไม่ให้เพื่อน ๆ ตัวอื่นมีความเสี่ยง พี่ ๆ จึงเล่นกับหนูได้แค่ตอนเย็นและต้องเล่นกับหนูเป็นตัวสุดท้าย ถ้าหนูได้มีบ้านเป็นของตัวเอง มีสถานที่ที่หนูสามารถเดินไปไหนก็ได้ มีใครสักคนที่หนูสามารถอ้อนได้ตลอดเวลาและมอบความรักให้หนู โดยไม่ต้องรอต่อคิวใคร.. หากคุณ…กำลังมองหาแมวสักตัวหากคุณ…เป็นอีกหนึ่งคนที่มีโอกาสที่จะเปลี่ยนชีวิตชีวิตหนึ่งไปตลอดกาล รับหนู “ซาบะ” ไว้พิจารณาดูสักครั้งนะคะ แมวเป็นโรคอย่างหนูจะเป็นแมวที่นิสัยดีที่สุด รักคุณที่สุด ตอบแทนโอกาสที่คุณมอบให้อย่างแน่นอนค่ะ", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "มีจ้า", + Birthdate: "2023-09-04 00:00:00.000000", + Gender: constant.MALE, + Color: "น้ำตาล", + Habit: "ขี้เล่น ขี้สงสัย ชอบกระโดด ทำหน้าตลกๆ", + Caption: "มีจ้าเป็นลูกแมวกำพร้าตัวคนเดียวติดมากับมอเตอร์ไซค์ จากนั้นได้รับความช่วยเหลือให้อยู่ในการดูแลจาก “แม่” มีคิ้ว ซึ่งทำหน้าที่เป็นคุณแม่บุญธรรมของมีจ้า ผ่านไปไม่นาน มีจ้าก็ได้มีพี่น้องชื่อ มะพร้าว และมะเฟือง แต่ภายหลัง ทั้งสามตัวป่วย เป็นโชคดีที่มีจ้าหายจากอาการป่วยมาได้ แต่แล้วโชคก็เล่นตลกร้ายกับมีจ้า เพราะทั้งมะพร้าวและมะเฟืองได้จากไปอย่างไม่มีวันกลับ ทำให้มีจ้าต้องกลับมาอยู่คนเดียวอีกครั้ง ระหว่างที่กำลังพักฟื้น หนูได้มีโอกาสพบเจอแมวอื่นมากมาย แต่ส่วนใหญ่ทุกคนก็ได้บ้านหมดแล้ว เหลือแต่หนูแล้วสิ แต่หนูก็จะรอ รอวันที่หนูจะไม่ต้องเหงาอีกแล้ว รอวันที่หนูได้รับความรัก ในชีวิตหนูมีช่วงเวลาให้ต้องอยู่คนเดียวมากมายเหลือเกิน หนูหวังว่าจะมีใครสักคนที่มาโอบกอดหนูไว้ มาพาหนูกลับบ้าน แล้วหนูจะไม่ต้องตัวคนเดียวอีก แต่เอ๊ะ! หนูได้ข่าวมาว่าพี่ๆในชมรมกำลังช่วยกันหาบ้านที่อบอุ่นให้กับหนู หนูดีใจและตื่นเต้นมากๆ ชักอดใจไม่ไหวที่จะสำรวจบ้านในอนาคตแล้วว", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "หวานเจี๊ยบ", + Birthdate: "2023-09-04 00:00:00.000000", + Gender: constant.FEMALE, + Color: "ดำ", + Habit: "แมวเด็กติดคน ชอบปีนขึ้นที่สูง ให้กระโดดขึ้นตักได้ ชอบเล่นซ่อนแอบแต่ก็วิ่งมาหาอยู่ดี", + Caption: "หนู ชื่อ “ หวานเจี๊ยบ ” นะค๊าา เพราะ หนูนิสัยน่ารักขี้อ้อนมากๆ หนูเป็นลูกแมวจรที่มีคนช่วยมา แต่พี่ที่ช่วยหนูมาไม่สามารถพาหนูกลับไปอยู่ด้วยได้ ได้แต่เลี้ยงหนูไว้ในกรง พี่ปล่อยให้หนูเดินเล่นบ้างเป็นบางเวลาภายในห้องเล็กๆเท่านั้น พี่เค้าจึงขอให้พี่ๆทีมงานในชมรมช่วยหาบ้านให้หนู เพราะ หนูจะได้มีบ้านที่อบอุ่นไม่ต้องอยู่แต่ในกรงอย่างทุกวันนี้", + Status: constant.ADOPTED, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "วินนี่", + Birthdate: "2023-10-04 00:00:00.000000", + Gender: constant.FEMALE, + Color: "ดำ", + Habit: "หนูค่อนข้างซน ชอบแกล้งพี่ๆทีมงาน ชอบงับๆนิ้วเพราะหนูหมั่นเขี้ยว😆 ใครได้หนูไป รับรองว่าไม่มีทางเหงาแน่นอน เพราะหนูก็อยากหาเพื่อนเล่นด้วยเหมือนกัน", + Caption: "ที่หนูชื่อว่า “ วินนี่” เพราะ พี่ทีมงานไปเจอหนูอยู่กับ พี่วินมอเตอร์ไซต์ที่เป็นคนพบและช่วยอุ้มหนูมาให้พี่ๆทีมงาน พี่ทีมงานรับหนูเข้ามาในชมรม เพราะเห็นว่าหนูยังเล็กมากๆ พี่ๆเป็นห่วง กลัวว่าถ้าปล่อยหนูไว้ที่เดิม น่าจะไม่รอดแน่ๆ อยู่แถวนั้น ไม่รู้ว่าจะมีใครให้อะไรกินได้บ้างมั้ย จะโดนรถแถวนั้นชนรึเปล่า ตัวหนูเล็กนิดเดียว รถอาจจะไม่ทันสังเกตเห็น ก็เลยพาหนูกลับมาชมรม รอหาบ้านให้ดีกว่า พอหนูเข้ามาพี่ๆก็พากันตั้งชื่อหนูกัน พี่ๆจะตั้งชื่อว่าหนูว่า วิน มันก็ดูจะแมนไปหน่อย เพราะ หนูเป็นผู้หญิง ก็เลยตั้งชื่อว่า วินนี่ ไปเลยแระกัน ก็ฟังดูน่ารักดีใช่มั้ยคะ หลังจากพี่ทีมงานรับหนูมาดูแลในชมรมสักพักนึง หนูก็ดันท้องเสียขึ้นมา ลำบากพี่ๆทีมงานพาหนูไปหาหมอกันใหญ่ ต้องคอยดูแล ป้อนข้าว ป้อนยาหนูอย่างใกล้ชิด จนตอนนี้หนูหายดีแล้ว กลับมาซน กลับซ่า วิ่งเล่นทั่วห้องได้เหมือนเดิม", + Status: constant.FINDHOME, + IsSterile: false, + IsVaccinated: true, + IsVisible: true, + Origin: "club", + Address: "", + Contact: "", + AdoptBy: "", + }, { + Type: "แมว", + Name: "มะกอก & มะกรูด", + Birthdate: "2023-06-18 00:00:00.000000", + Gender: constant.MALE, + Color: "เทา", + Habit: "ขี้เล่น สุขภาพแข็งแรงดี", + Caption: "มะกอกกระโดดไม่ค่อยได้ เพราะ เคยตกหลังคามาก่อน", + Status: constant.FINDHOME, + IsSterile: false, + IsVaccinated: true, + IsVisible: true, + Origin: "entrust", + Address: "ซอยราชครู ถ.พหลโยธิน พญาไท", + Contact: "เบอร์โทร 0863450127 , Line ID: pumviranee", + AdoptBy: "", + }, { + Type: "แมว", + Name: "น้องมอม", + Birthdate: "2022-01-18 00:00:00.000000", + Gender: constant.FEMALE, + Color: "เทา", + Habit: "ขี้อ้อน ขี้กลัว", + Caption: "คาดว่าหลุดมา ก่อนหน้านี้มีคลอดลูกแล้ว 3 ตัว ลูกๆได้บ้านครบแล้ว เหลือแม่เหมียวที่ยังไม่มีคนรับเลี้ยง", + Status: constant.FINDHOME, + IsSterile: true, + IsVaccinated: true, + IsVisible: true, + Origin: "entrust", + Address: "บางรัก", + Contact: "inbox โดยตรงที่ Noppawan Pleankhum", + AdoptBy: "", + }, { + Type: "แมว", + Name: "น้องเด็กหรือแมวเด็ก", + Birthdate: "2023-06-04 00:00:00.000000", + Gender: constant.FEMALE, + Color: "น้ำตาล", + Habit: "ไม่ได้ระบุนิสัยมาให้", + Caption: "คาดว่าน้องน่าจะพลัดหลงกับแม่ ตอนฝนตกหนัก", + Status: constant.FINDHOME, + IsSterile: false, + IsVaccinated: false, + IsVisible: true, + Origin: "entrust", + Address: "ราชเทวี", + Contact: "Line ID: @paboyababy , เบอร์โทร 0846145357", + AdoptBy: "", + }, { + Type: "แมว", + Name: "น้องเล็ก", + Birthdate: "2023-06-04 00:00:00.000000", + Gender: constant.MALE, + Color: "เทา", + Habit: "เชื่อง ยอมให้จับ ให้ลูบเล่นและอุ้มได้ แต่ตอนนี้น้องอยู่แต่ในกรง ทำให้ไม่ได้ใช้ชีวิตเท่าที่ควร น้องอยากออกจากกรงมาก ถ้าได้บ้านคงจะติดคนและขี้อ้อนน่าดู", + Caption: "ไม่ได้ระบุประวัติมาให้", + Status: constant.FINDHOME, + IsSterile: false, + IsVaccinated: false, + IsVisible: true, + Origin: "entrust", + Address: "พระราม4 เขตคลองเตย อยู่ตรงข้ามกับการไฟฟ้านครหลวงคลองเคย", + Contact: " เบอร์ 081-8221625", + AdoptBy: "", + }, { + Type: "แมว", + Name: "หนิงหนิง", + Birthdate: "2023-08-18 00:00:00.000000", + Gender: constant.MALE, + Color: "นวล", + Habit: "ยังกลัวๆอยู่ ขี้อ้อน เรียบร้อย ไม่ซน ไม่กัด", + Caption: "น้องเคยป่วยมาก่อนและได้พาไปรักษาจนหายเรียบร้อย", + Status: constant.FINDHOME, + IsSterile: false, + IsVaccinated: true, + IsVisible: true, + Origin: "entrust", + Address: "ภายในกทม / สมุทรปราการ", + Contact: "ติดต่อ 0992127851", + AdoptBy: "", + }, +} diff --git a/src/database/seeds/seeder.go b/src/database/seeds/seeder.go new file mode 100644 index 0000000..1cae69b --- /dev/null +++ b/src/database/seeds/seeder.go @@ -0,0 +1,95 @@ +package seed + +import ( + "log" + "reflect" + "sort" + "strconv" + "strings" + + "github.com/pkg/errors" + "gorm.io/gorm" +) + +type Seed struct { + db *gorm.DB +} + +type Method struct { + Name string // actually name + Timestamp string +} + +func seed(s Seed, seedMethodName string) error { + m := reflect.ValueOf(s).MethodByName(seedMethodName) + + if !m.IsValid() { + return errors.New("invalid seed") + } + + err := m.Call(nil) + if !err[0].IsNil() { + log.Fatalf("Cannot seed %v , got an error %v", seedMethodName, err[0]) + } + + log.Println("✔️Seed", seedMethodName, "succeed") + + return nil +} + +func Execute(db *gorm.DB, seedMethodNames ...string) error { + s := Seed{db} + + seedType := reflect.TypeOf(s) + + var seedMethods []Method + seeds := make(map[string]reflect.Method) + + for i := 0; i < seedType.NumMethod(); i++ { + method := seedType.Method(i) + + name := strings.Split(method.Name, "Seed") + + seedMethod := Method{ + Name: name[0], + Timestamp: name[1], + } + + seedMethods = append(seedMethods, seedMethod) + seeds[name[0]] = method + } + + sort.Slice(seedMethods, func(p, q int) bool { + timestamp1, err := strconv.Atoi(seedMethods[p].Timestamp) + if err != nil { + log.Fatalln(err) + } + + timestamp2, err := strconv.Atoi(seedMethods[q].Timestamp) + if err != nil { + log.Fatalln(err) + } + + return timestamp1 < timestamp2 + }) + + // Execute all + if len(seedMethodNames) == 0 { + log.Println("Running all seeder...") + for _, seedMethod := range seedMethods { + err := seed(s, seeds[seedMethod.Name].Name) + if err != nil { + return err + } + } + } + + // Execute only the given names + for _, item := range seedMethodNames { + err := seed(s, seeds[item].Name) + if err != nil { + return err + } + } + return nil +} diff --git a/src/main.go b/src/main.go index 7ee7b44..f1b33ad 100644 --- a/src/main.go +++ b/src/main.go @@ -2,6 +2,7 @@ package main import ( "context" + "flag" "fmt" "net" "os" @@ -17,6 +18,7 @@ import ( petSrv "github.com/isd-sgcu/johnjud-backend/src/app/service/pet" "github.com/isd-sgcu/johnjud-backend/src/config" "github.com/isd-sgcu/johnjud-backend/src/database" + seed "github.com/isd-sgcu/johnjud-backend/src/database/seeds" likePb "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/like/v1" petPb "github.com/isd-sgcu/johnjud-go-proto/johnjud/backend/pet/v1" imagePb "github.com/isd-sgcu/johnjud-go-proto/johnjud/file/image/v1" @@ -26,8 +28,27 @@ import ( "google.golang.org/grpc/health" "google.golang.org/grpc/health/grpc_health_v1" "google.golang.org/grpc/reflection" + "gorm.io/gorm" ) +func handleArgs(db *gorm.DB) { + flag.Parse() + args := flag.Args() + + if len(args) >= 1 { + switch args[0] { + case "seed": + err := seed.Execute(db, args[1:]...) + if err != nil { + log.Fatal(). + Str("service", "seeder"). + Msg("Not found seed") + } + os.Exit(0) + } + } +} + type operation func(ctx context.Context) error func gracefulShutdown(ctx context.Context, timeout time.Duration, ops map[string]operation) <-chan struct{} { @@ -101,6 +122,8 @@ func main() { Msg("Failed to init postgres connection") } + handleArgs(db) + fileConn, err := grpc.Dial(conf.Service.File, grpc.WithTransportCredentials(insecure.NewCredentials())) if err != nil { log.Fatal().