package mysql import ( "context" "database/sql" "errors" "time" "git.gocasts.ir/ebhomengo/niki/driverapp/service/entity" errmsg "git.gocasts.ir/ebhomengo/niki/pkg/err_msg" richerror "git.gocasts.ir/ebhomengo/niki/pkg/rich_error" "git.gocasts.ir/ebhomengo/niki/pkg/types" "git.gocasts.ir/ebhomengo/niki/repository/mysql" ) const ( StatementKeyIsExistDriverByPhoneNumber = iota + 1 StatementKeyCreateDriver = iota + 1 ) type DriverRepo struct { conn *mysql.DB } func New(conn *mysql.DB) DriverRepo { return DriverRepo{ conn: conn, } } func (r DriverRepo) IsExistDriverByPhoneNumber(ctx context.Context, phoneNumber string) (bool, entity.Driver, error) { const op = "Repository.IsExistDriverByPhoneNumber" query := `select * from drivers where phone_number = ?` stmt, err := r.conn.PrepareStatement(ctx, StatementKeyIsExistDriverByPhoneNumber, query) if err != nil { return false, entity.Driver{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected). WithMessage(errmsg.ErrorMsgCantPrepareStatement) } defer stmt.Close() row := stmt.QueryRowContext(ctx, phoneNumber) d, sErr := DriverScan(row) if sErr != nil { if errors.Is(sErr, sql.ErrNoRows) { return false, entity.Driver{}, richerror.New(op).WithKind(richerror.KindNotFound). WithMessage(errmsg.ErrorMsgNotFound) } return false, entity.Driver{}, richerror.New(op).WithErr(err). WithMessage(errmsg.ErrorMsgCantScanQueryResult).WithKind(richerror.KindUnexpected) } return true, d, nil } func (r DriverRepo) CreateDriver(ctx context.Context, driver entity.Driver) (entity.Driver, error) { const op = "Repository.CreateDriver" query := `insert into drivers(phone_number) values(?)` stmt, err := r.conn.PrepareStatement(ctx, StatementKeyCreateDriver, query) if err != nil { return entity.Driver{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected). WithMessage(errmsg.ErrorMsgCantPrepareStatement) } res, err := stmt.ExecContext(ctx, driver.PhoneNumber) if err != nil { return entity.Driver{}, richerror.New(op).WithErr(err).WithKind(richerror.KindUnexpected). WithMessage(errmsg.ErrorMsgNotFound) } id, _ := res.LastInsertId() driver.ID = types.ID(id) return driver, nil } func DriverScan(scanner mysql.Scanner) (entity.Driver, error) { var createdAt, updatedAt time.Time var driver entity.Driver err := scanner.Scan(&driver.ID, &driver.FirstName, &driver.LastName, &driver.PhoneNumber, &driver.NationalCode, &driver.LicenseNumber, &driver.BirthDate, &createdAt, &updatedAt) return driver, err }