pg_task_repository.go 7.5 KB
package repository

import (
	"fmt"
	"github.com/go-pg/pg"
	pgTransaction "github.com/linmadan/egglib-go/transaction/pg"
	"github.com/linmadan/egglib-go/utils/snowflake"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/domain"
	"gitlab.fjmaimaimai.com/linmadan/mmm-worth/pkg/infrastructure/pg/models"
)

type TaskRepository struct {
	transactionContext *pgTransaction.TransactionContext
}

func (repository *TaskRepository) nextIdentify() (int64, error) {
	IdWorker, err := snowflake.NewIdWorker(1)
	if err != nil {
		return 0, err
	}
	id, err := IdWorker.NextId()
	return id, err
}
func (repository *TaskRepository) Save(task *domain.Task) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	if task.Identify() == nil {
		_, err := repository.nextIdentify()
		if err != nil {
			return task, err
		}
		if _, err := tx.QueryOne(
			pg.Scan(&task.TakeId, &task.TaskName, &task.TaskType, &task.Sponsor, &task.TaskStatus, &task.ReferenceResource, pg.Array(&task.CustomerValue), &task.TaskNature, &task.SuMoney, &task.AcceptanceStandard, &task.TaskDescription, pg.Array(&task.TaskPictureUrls), &task.IsRewardTake, &task.CreateTime, &task.RobInfo, &task.BidInfo, pg.Array(&task.Participants), pg.Array(&task.TaskPercentage), &task.SolveReport, pg.Array(&task.SolvePictureUrls)),
			"INSERT INTO tasks (id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, rob_info, bid_info, participants, task_percentage, solve_report, solve_picture_urls) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?) RETURNING id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, rob_info, bid_info, participants, task_percentage, solve_report, solve_picture_urls",
			task.TakeId, task.TaskName, task.TaskType, task.Sponsor, task.TaskStatus, task.ReferenceResource, pg.Array(task.CustomerValue), task.TaskNature, task.SuMoney, task.AcceptanceStandard, task.TaskDescription, pg.Array(task.TaskPictureUrls), task.IsRewardTake, task.CreateTime, task.RobInfo, task.BidInfo, pg.Array(task.Participants), pg.Array(task.TaskPercentage), task.SolveReport, pg.Array(task.SolvePictureUrls)); err != nil {
			return task, err
		}
	} else {
		if _, err := tx.QueryOne(
			pg.Scan(&task.TakeId, &task.TaskName, &task.TaskType, &task.Sponsor, &task.TaskStatus, &task.ReferenceResource, pg.Array(&task.CustomerValue), &task.TaskNature, &task.SuMoney, &task.AcceptanceStandard, &task.TaskDescription, pg.Array(&task.TaskPictureUrls), &task.IsRewardTake, &task.CreateTime, &task.RobInfo, &task.BidInfo, pg.Array(&task.Participants), pg.Array(&task.TaskPercentage), &task.SolveReport, pg.Array(&task.SolvePictureUrls)),
			"UPDATE tasks SET task_name=?, task_type=?, sponsor=?, task_status=?, reference_resource=?, customer_value=?, task_nature=?, su_money=?, acceptance_standard=?, task_description=?, task_picture_urls=?, is_reward_take=?, create_time=?, rob_info=?, bid_info=?, participants=?, task_percentage=?, solve_report=?, solve_picture_urls=? WHERE id=? RETURNING id, task_name, task_type, sponsor, task_status, reference_resource, customer_value, task_nature, su_money, acceptance_standard, task_description, task_picture_urls, is_reward_take, create_time, rob_info, bid_info, participants, task_percentage, solve_report, solve_picture_urls",
			task.TaskName, task.TaskType, task.Sponsor, task.TaskStatus, task.ReferenceResource, pg.Array(task.CustomerValue), task.TaskNature, task.SuMoney, task.AcceptanceStandard, task.TaskDescription, pg.Array(task.TaskPictureUrls), task.IsRewardTake, task.CreateTime, task.RobInfo, task.BidInfo, pg.Array(task.Participants), pg.Array(task.TaskPercentage), task.SolveReport, pg.Array(task.SolvePictureUrls), task.Identify()); err != nil {
			return task, err
		}
	}
	return task, nil
}
func (repository *TaskRepository) Remove(task *domain.Task) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	taskModel := new(models.Task)
	taskModel.Id = task.Identify().(int64)
	if _, err := tx.Model(taskModel).WherePK().Delete(); err != nil {
		return task, err
	}
	return task, nil
}
func (repository *TaskRepository) FindOne(queryOptions map[string]interface{}) (*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	taskModel := new(models.Task)
	query := tx.Model(taskModel)
	if taskId, ok := queryOptions["taskId"]; ok {
		query = query.Where("task.id = ?", taskId)
	}
	if err := query.Limit(1).Select(); err != nil {
		return nil, err
	}
	if taskModel.Id == 0 {
		return nil, nil
	} else {
		return &domain.Task{
			TakeId:             taskModel.Id,
			TaskName:           taskModel.TaskName,
			TaskType:           taskModel.TaskType,
			Sponsor:            taskModel.Sponsor,
			TaskStatus:         taskModel.TaskStatus,
			ReferenceResource:  taskModel.ReferenceResource,
			CustomerValue:      taskModel.CustomerValue,
			TaskNature:         taskModel.TaskNature,
			SuMoney:            taskModel.SuMoney,
			AcceptanceStandard: taskModel.AcceptanceStandard,
			TaskDescription:    taskModel.TaskDescription,
			TaskPictureUrls:    taskModel.TaskPictureUrls,
			IsRewardTake:       taskModel.IsRewardTake,
			CreateTime:         taskModel.CreateTime,
			RobInfo:            taskModel.RobInfo,
			BidInfo:            taskModel.BidInfo,
			Participants:       taskModel.Participants,
			TaskPercentage:     taskModel.TaskPercentage,
			SolveReport:        taskModel.SolveReport,
			SolvePictureUrls:   taskModel.SolvePictureUrls,
		}, nil
	}
}
func (repository *TaskRepository) Find(queryOptions map[string]interface{}) (int64, []*domain.Task, error) {
	tx := repository.transactionContext.PgTx
	var taskModels []*models.Task
	var tasks []*domain.Task
	query := tx.Model(&taskModels)
	if offset, ok := queryOptions["offset"]; ok {
		offset := offset.(int)
		if offset > -1 {
			query = query.Offset(offset)
		}
	} else {
		query = query.Offset(0)
	}
	if limit, ok := queryOptions["limit"]; ok {
		limit := limit.(int)
		if limit > -1 {
			query = query.Limit(limit)
		}
	} else {
		query = query.Limit(20)
	}
	if count, err := query.Order("id DESC").SelectAndCount(); err != nil {
		return 0, nil, err
	} else {
		for _, taskModel := range taskModels {
			tasks = append(tasks, &domain.Task{
				TakeId:             taskModel.Id,
				TaskName:           taskModel.TaskName,
				TaskType:           taskModel.TaskType,
				Sponsor:            taskModel.Sponsor,
				TaskStatus:         taskModel.TaskStatus,
				ReferenceResource:  taskModel.ReferenceResource,
				CustomerValue:      taskModel.CustomerValue,
				TaskNature:         taskModel.TaskNature,
				SuMoney:            taskModel.SuMoney,
				AcceptanceStandard: taskModel.AcceptanceStandard,
				TaskDescription:    taskModel.TaskDescription,
				TaskPictureUrls:    taskModel.TaskPictureUrls,
				IsRewardTake:       taskModel.IsRewardTake,
				CreateTime:         taskModel.CreateTime,
				RobInfo:            taskModel.RobInfo,
				BidInfo:            taskModel.BidInfo,
				Participants:       taskModel.Participants,
				TaskPercentage:     taskModel.TaskPercentage,
				SolveReport:        taskModel.SolveReport,
				SolvePictureUrls:   taskModel.SolvePictureUrls,
			})
		}
		return int64(count), tasks, nil
	}
}
func NewTaskRepository(transactionContext *pgTransaction.TransactionContext) (*TaskRepository, error) {
	if transactionContext == nil {
		return nil, fmt.Errorf("transactionContext参数不能为nil")
	} else {
		return &TaskRepository{
			transactionContext: transactionContext,
		}, nil
	}
}