add region, regency, province
This commit is contained in:
parent
ddca119e45
commit
6cd35d7ffa
37
api/region.go
Normal file
37
api/region.go
Normal file
@ -0,0 +1,37 @@
|
|||||||
|
package api
|
||||||
|
|
||||||
|
import (
|
||||||
|
"net/http"
|
||||||
|
|
||||||
|
"github.com/gin-gonic/gin"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (server *Server) getListRegions(ctx *gin.Context) {
|
||||||
|
regions, err := server.Store.GetListRegions(ctx)
|
||||||
|
if err != nil {
|
||||||
|
ctx.JSON(http.StatusInternalServerError, ErrorResponse(err, "Something went wrong while try to get regions"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.JSON(http.StatusOK, regions)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (server *Server) getListProvinces(ctx *gin.Context) {
|
||||||
|
provinces, err := server.Store.GetListProvinces(ctx)
|
||||||
|
if err != nil {
|
||||||
|
ctx.JSON(http.StatusInternalServerError, ErrorResponse(err, "Something went wrong while try to get regions"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.JSON(http.StatusOK, provinces)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (server *Server) getListRegencies(ctx *gin.Context) {
|
||||||
|
regencies, err := server.Store.GetListRegencies(ctx)
|
||||||
|
if err != nil {
|
||||||
|
ctx.JSON(http.StatusInternalServerError, ErrorResponse(err, "Something went wrong while try to get regions"))
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
ctx.JSON(http.StatusOK, regencies)
|
||||||
|
}
|
@ -48,6 +48,9 @@ func (server *Server) getRoutes() {
|
|||||||
router.POST("/user/signup", server.createUser)
|
router.POST("/user/signup", server.createUser)
|
||||||
router.POST("/user/login", server.login)
|
router.POST("/user/login", server.login)
|
||||||
router.POST("/user/logout", server.logout)
|
router.POST("/user/logout", server.logout)
|
||||||
|
router.GET("/regions", server.getListRegions)
|
||||||
|
router.GET("/region/provinces", server.getListProvinces)
|
||||||
|
router.GET("/region/regencies", server.getListRegencies)
|
||||||
|
|
||||||
// LOCATION
|
// LOCATION
|
||||||
router.POST("/locations", server.createLocation)
|
router.POST("/locations", server.createLocation)
|
||||||
|
@ -169,6 +169,21 @@ func (mr *MockStoreMockRecorder) GetListLocations(arg0 interface{}) *gomock.Call
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListLocations", reflect.TypeOf((*MockStore)(nil).GetListLocations), arg0)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListLocations", reflect.TypeOf((*MockStore)(nil).GetListLocations), arg0)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetListProvinces mocks base method.
|
||||||
|
func (m *MockStore) GetListProvinces(arg0 context.Context) ([]db.GetListProvincesRow, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetListProvinces", arg0)
|
||||||
|
ret0, _ := ret[0].([]db.GetListProvincesRow)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetListProvinces indicates an expected call of GetListProvinces.
|
||||||
|
func (mr *MockStoreMockRecorder) GetListProvinces(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListProvinces", reflect.TypeOf((*MockStore)(nil).GetListProvinces), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// GetListRecentLocationsWithRatings mocks base method.
|
// GetListRecentLocationsWithRatings mocks base method.
|
||||||
func (m *MockStore) GetListRecentLocationsWithRatings(arg0 context.Context, arg1 int32) ([]db.GetListRecentLocationsWithRatingsRow, error) {
|
func (m *MockStore) GetListRecentLocationsWithRatings(arg0 context.Context, arg1 int32) ([]db.GetListRecentLocationsWithRatingsRow, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
@ -184,6 +199,36 @@ func (mr *MockStoreMockRecorder) GetListRecentLocationsWithRatings(arg0, arg1 in
|
|||||||
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListRecentLocationsWithRatings", reflect.TypeOf((*MockStore)(nil).GetListRecentLocationsWithRatings), arg0, arg1)
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListRecentLocationsWithRatings", reflect.TypeOf((*MockStore)(nil).GetListRecentLocationsWithRatings), arg0, arg1)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// GetListRegencies mocks base method.
|
||||||
|
func (m *MockStore) GetListRegencies(arg0 context.Context) ([]db.GetListRegenciesRow, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetListRegencies", arg0)
|
||||||
|
ret0, _ := ret[0].([]db.GetListRegenciesRow)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetListRegencies indicates an expected call of GetListRegencies.
|
||||||
|
func (mr *MockStoreMockRecorder) GetListRegencies(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListRegencies", reflect.TypeOf((*MockStore)(nil).GetListRegencies), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetListRegions mocks base method.
|
||||||
|
func (m *MockStore) GetListRegions(arg0 context.Context) ([]db.GetListRegionsRow, error) {
|
||||||
|
m.ctrl.T.Helper()
|
||||||
|
ret := m.ctrl.Call(m, "GetListRegions", arg0)
|
||||||
|
ret0, _ := ret[0].([]db.GetListRegionsRow)
|
||||||
|
ret1, _ := ret[1].(error)
|
||||||
|
return ret0, ret1
|
||||||
|
}
|
||||||
|
|
||||||
|
// GetListRegions indicates an expected call of GetListRegions.
|
||||||
|
func (mr *MockStoreMockRecorder) GetListRegions(arg0 interface{}) *gomock.Call {
|
||||||
|
mr.mock.ctrl.T.Helper()
|
||||||
|
return mr.mock.ctrl.RecordCallWithMethodType(mr.mock, "GetListRegions", reflect.TypeOf((*MockStore)(nil).GetListRegions), arg0)
|
||||||
|
}
|
||||||
|
|
||||||
// GetLocation mocks base method.
|
// GetLocation mocks base method.
|
||||||
func (m *MockStore) GetLocation(arg0 context.Context, arg1 int32) (db.GetLocationRow, error) {
|
func (m *MockStore) GetLocation(arg0 context.Context, arg1 int32) (db.GetLocationRow, error) {
|
||||||
m.ctrl.T.Helper()
|
m.ctrl.T.Helper()
|
||||||
|
6
db/queries/provinces.sql
Normal file
6
db/queries/provinces.sql
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
-- name: GetListProvinces :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
province_name,
|
||||||
|
region_id
|
||||||
|
FROM PROVINCES;
|
6
db/queries/regencies.sql
Normal file
6
db/queries/regencies.sql
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
-- name: GetListRegencies :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
regency_name,
|
||||||
|
province_id
|
||||||
|
FROM regencies;
|
5
db/queries/regions.sql
Normal file
5
db/queries/regions.sql
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
-- name: GetListRegions :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
region_name
|
||||||
|
FROM regions;
|
@ -42,7 +42,7 @@ func (q *Queries) CreateLocation(ctx context.Context, arg CreateLocationParams)
|
|||||||
}
|
}
|
||||||
|
|
||||||
const getListLocations = `-- name: GetListLocations :many
|
const getListLocations = `-- name: GetListLocations :many
|
||||||
SELECT id, address, name, google_maps_link, submitted_by, total_visited, thumbnail, regency_id, is_deleted, created_at, updated_at, approved_by, approved_at FROM locations
|
SELECT id, address, name, google_maps_link, location_type, submitted_by, total_visited, thumbnail, regency_id, is_deleted, created_at, updated_at, approved_by, approved_at FROM locations
|
||||||
`
|
`
|
||||||
|
|
||||||
func (q *Queries) GetListLocations(ctx context.Context) ([]Location, error) {
|
func (q *Queries) GetListLocations(ctx context.Context) ([]Location, error) {
|
||||||
@ -59,6 +59,7 @@ func (q *Queries) GetListLocations(ctx context.Context) ([]Location, error) {
|
|||||||
&i.Address,
|
&i.Address,
|
||||||
&i.Name,
|
&i.Name,
|
||||||
&i.GoogleMapsLink,
|
&i.GoogleMapsLink,
|
||||||
|
&i.LocationType,
|
||||||
&i.SubmittedBy,
|
&i.SubmittedBy,
|
||||||
&i.TotalVisited,
|
&i.TotalVisited,
|
||||||
&i.Thumbnail,
|
&i.Thumbnail,
|
||||||
|
@ -57,6 +57,51 @@ func (ns NullCommentType) Value() (driver.Value, error) {
|
|||||||
return string(ns.CommentType), nil
|
return string(ns.CommentType), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type LocationType string
|
||||||
|
|
||||||
|
const (
|
||||||
|
LocationTypeBeach LocationType = "beach"
|
||||||
|
LocationTypeAmusementpark LocationType = "amusement park"
|
||||||
|
LocationTypeCulinary LocationType = "culinary"
|
||||||
|
LocationTypeHikingCamping LocationType = "hiking / camping"
|
||||||
|
LocationTypeOther LocationType = "other"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (e *LocationType) Scan(src interface{}) error {
|
||||||
|
switch s := src.(type) {
|
||||||
|
case []byte:
|
||||||
|
*e = LocationType(s)
|
||||||
|
case string:
|
||||||
|
*e = LocationType(s)
|
||||||
|
default:
|
||||||
|
return fmt.Errorf("unsupported scan type for LocationType: %T", src)
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
type NullLocationType struct {
|
||||||
|
LocationType LocationType `json:"location_type"`
|
||||||
|
Valid bool `json:"valid"` // Valid is true if LocationType is not NULL
|
||||||
|
}
|
||||||
|
|
||||||
|
// Scan implements the Scanner interface.
|
||||||
|
func (ns *NullLocationType) Scan(value interface{}) error {
|
||||||
|
if value == nil {
|
||||||
|
ns.LocationType, ns.Valid = "", false
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
ns.Valid = true
|
||||||
|
return ns.LocationType.Scan(value)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Value implements the driver Valuer interface.
|
||||||
|
func (ns NullLocationType) Value() (driver.Value, error) {
|
||||||
|
if !ns.Valid {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
return string(ns.LocationType), nil
|
||||||
|
}
|
||||||
|
|
||||||
type UserReportsType string
|
type UserReportsType string
|
||||||
|
|
||||||
const (
|
const (
|
||||||
@ -140,6 +185,7 @@ type Location struct {
|
|||||||
Address string `json:"address"`
|
Address string `json:"address"`
|
||||||
Name string `json:"name"`
|
Name string `json:"name"`
|
||||||
GoogleMapsLink sql.NullString `json:"google_maps_link"`
|
GoogleMapsLink sql.NullString `json:"google_maps_link"`
|
||||||
|
LocationType LocationType `json:"location_type"`
|
||||||
SubmittedBy int32 `json:"submitted_by"`
|
SubmittedBy int32 `json:"submitted_by"`
|
||||||
TotalVisited sql.NullInt32 `json:"total_visited"`
|
TotalVisited sql.NullInt32 `json:"total_visited"`
|
||||||
Thumbnail sql.NullString `json:"thumbnail"`
|
Thumbnail sql.NullString `json:"thumbnail"`
|
||||||
@ -161,38 +207,39 @@ type LocationImage struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Province struct {
|
type Province struct {
|
||||||
ID int32 `json:"id"`
|
ID int32 `json:"id"`
|
||||||
ProvinceName sql.NullString `json:"province_name"`
|
ProvinceName string `json:"province_name"`
|
||||||
RegionID int16 `json:"region_id"`
|
RegionID int16 `json:"region_id"`
|
||||||
CreatedAt sql.NullTime `json:"created_at"`
|
CreatedAt sql.NullTime `json:"created_at"`
|
||||||
UpdatedAt sql.NullTime `json:"updated_at"`
|
UpdatedAt sql.NullTime `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Regency struct {
|
type Regency struct {
|
||||||
ID int32 `json:"id"`
|
ID int32 `json:"id"`
|
||||||
RegencyName sql.NullString `json:"regency_name"`
|
RegencyName string `json:"regency_name"`
|
||||||
ProvinceID int16 `json:"province_id"`
|
ProvinceID int16 `json:"province_id"`
|
||||||
CreatedAt sql.NullTime `json:"created_at"`
|
CreatedAt sql.NullTime `json:"created_at"`
|
||||||
UpdatedAt sql.NullTime `json:"updated_at"`
|
UpdatedAt sql.NullTime `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Region struct {
|
type Region struct {
|
||||||
ID int32 `json:"id"`
|
ID int32 `json:"id"`
|
||||||
RegionName sql.NullString `json:"region_name"`
|
RegionName string `json:"region_name"`
|
||||||
CreatedAt sql.NullTime `json:"created_at"`
|
CreatedAt sql.NullTime `json:"created_at"`
|
||||||
UpdatedAt sql.NullTime `json:"updated_at"`
|
UpdatedAt sql.NullTime `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Review struct {
|
type Review struct {
|
||||||
ID int32 `json:"id"`
|
ID int32 `json:"id"`
|
||||||
SubmittedBy int32 `json:"submitted_by"`
|
SubmittedBy int32 `json:"submitted_by"`
|
||||||
Comments string `json:"comments"`
|
Comments string `json:"comments"`
|
||||||
Score int16 `json:"score"`
|
Score int16 `json:"score"`
|
||||||
IsFromCritic bool `json:"is_from_critic"`
|
IsFromCritic bool `json:"is_from_critic"`
|
||||||
IsHided bool `json:"is_hided"`
|
CostApprox sql.NullInt32 `json:"cost_approx"`
|
||||||
LocationID int32 `json:"location_id"`
|
IsHided bool `json:"is_hided"`
|
||||||
CreatedAt sql.NullTime `json:"created_at"`
|
LocationID int32 `json:"location_id"`
|
||||||
UpdatedAt sql.NullTime `json:"updated_at"`
|
CreatedAt sql.NullTime `json:"created_at"`
|
||||||
|
UpdatedAt sql.NullTime `json:"updated_at"`
|
||||||
}
|
}
|
||||||
|
|
||||||
type Tag struct {
|
type Tag struct {
|
||||||
|
47
db/sqlc/provinces.sql.go
Normal file
47
db/sqlc/provinces.sql.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.20.0
|
||||||
|
// source: provinces.sql
|
||||||
|
|
||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const getListProvinces = `-- name: GetListProvinces :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
province_name,
|
||||||
|
region_id
|
||||||
|
FROM PROVINCES
|
||||||
|
`
|
||||||
|
|
||||||
|
type GetListProvincesRow struct {
|
||||||
|
ID int32 `json:"id"`
|
||||||
|
ProvinceName string `json:"province_name"`
|
||||||
|
RegionID int16 `json:"region_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) GetListProvinces(ctx context.Context) ([]GetListProvincesRow, error) {
|
||||||
|
rows, err := q.db.QueryContext(ctx, getListProvinces)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
items := []GetListProvincesRow{}
|
||||||
|
for rows.Next() {
|
||||||
|
var i GetListProvincesRow
|
||||||
|
if err := rows.Scan(&i.ID, &i.ProvinceName, &i.RegionID); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Close(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
@ -15,7 +15,10 @@ type Querier interface {
|
|||||||
CreateUser(ctx context.Context, arg CreateUserParams) (User, error)
|
CreateUser(ctx context.Context, arg CreateUserParams) (User, error)
|
||||||
GetCountImageByLocation(ctx context.Context, imageOf int32) (int64, error)
|
GetCountImageByLocation(ctx context.Context, imageOf int32) (int64, error)
|
||||||
GetListLocations(ctx context.Context) ([]Location, error)
|
GetListLocations(ctx context.Context) ([]Location, error)
|
||||||
|
GetListProvinces(ctx context.Context) ([]GetListProvincesRow, error)
|
||||||
GetListRecentLocationsWithRatings(ctx context.Context, limit int32) ([]GetListRecentLocationsWithRatingsRow, error)
|
GetListRecentLocationsWithRatings(ctx context.Context, limit int32) ([]GetListRecentLocationsWithRatingsRow, error)
|
||||||
|
GetListRegencies(ctx context.Context) ([]GetListRegenciesRow, error)
|
||||||
|
GetListRegions(ctx context.Context) ([]GetListRegionsRow, error)
|
||||||
GetLocationTag(ctx context.Context, targetID int32) ([]string, error)
|
GetLocationTag(ctx context.Context, targetID int32) ([]string, error)
|
||||||
GetSession(ctx context.Context, id int32) (UserSession, error)
|
GetSession(ctx context.Context, id int32) (UserSession, error)
|
||||||
GetUserReviewByLocation(ctx context.Context, arg GetUserReviewByLocationParams) (GetUserReviewByLocationRow, error)
|
GetUserReviewByLocation(ctx context.Context, arg GetUserReviewByLocationParams) (GetUserReviewByLocationRow, error)
|
||||||
|
47
db/sqlc/regencies.sql.go
Normal file
47
db/sqlc/regencies.sql.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.20.0
|
||||||
|
// source: regencies.sql
|
||||||
|
|
||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const getListRegencies = `-- name: GetListRegencies :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
regency_name,
|
||||||
|
province_id
|
||||||
|
FROM regencies
|
||||||
|
`
|
||||||
|
|
||||||
|
type GetListRegenciesRow struct {
|
||||||
|
ID int32 `json:"id"`
|
||||||
|
RegencyName string `json:"regency_name"`
|
||||||
|
ProvinceID int16 `json:"province_id"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) GetListRegencies(ctx context.Context) ([]GetListRegenciesRow, error) {
|
||||||
|
rows, err := q.db.QueryContext(ctx, getListRegencies)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
items := []GetListRegenciesRow{}
|
||||||
|
for rows.Next() {
|
||||||
|
var i GetListRegenciesRow
|
||||||
|
if err := rows.Scan(&i.ID, &i.RegencyName, &i.ProvinceID); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Close(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
45
db/sqlc/regions.sql.go
Normal file
45
db/sqlc/regions.sql.go
Normal file
@ -0,0 +1,45 @@
|
|||||||
|
// Code generated by sqlc. DO NOT EDIT.
|
||||||
|
// versions:
|
||||||
|
// sqlc v1.20.0
|
||||||
|
// source: regions.sql
|
||||||
|
|
||||||
|
package db
|
||||||
|
|
||||||
|
import (
|
||||||
|
"context"
|
||||||
|
)
|
||||||
|
|
||||||
|
const getListRegions = `-- name: GetListRegions :many
|
||||||
|
SELECT
|
||||||
|
id,
|
||||||
|
region_name
|
||||||
|
FROM regions
|
||||||
|
`
|
||||||
|
|
||||||
|
type GetListRegionsRow struct {
|
||||||
|
ID int32 `json:"id"`
|
||||||
|
RegionName string `json:"region_name"`
|
||||||
|
}
|
||||||
|
|
||||||
|
func (q *Queries) GetListRegions(ctx context.Context) ([]GetListRegionsRow, error) {
|
||||||
|
rows, err := q.db.QueryContext(ctx, getListRegions)
|
||||||
|
if err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
defer rows.Close()
|
||||||
|
items := []GetListRegionsRow{}
|
||||||
|
for rows.Next() {
|
||||||
|
var i GetListRegionsRow
|
||||||
|
if err := rows.Scan(&i.ID, &i.RegionName); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
items = append(items, i)
|
||||||
|
}
|
||||||
|
if err := rows.Close(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
if err := rows.Err(); err != nil {
|
||||||
|
return nil, err
|
||||||
|
}
|
||||||
|
return items, nil
|
||||||
|
}
|
Loading…
Reference in New Issue
Block a user