create product at ydb
This commit is contained in:
@ -128,7 +128,7 @@ func (r *ydbCourseRepository) Get(ctx context.Context, id string) (course domain
|
||||
starts_at,
|
||||
created_at,
|
||||
updated_at,
|
||||
deleted_at,
|
||||
deleted_at
|
||||
FROM
|
||||
courses
|
||||
WHERE
|
||||
@ -171,8 +171,89 @@ func (r *ydbCourseRepository) GetByExternalID(ctx context.Context, id string) (d
|
||||
return domain.Course{}, nil
|
||||
}
|
||||
|
||||
func (r *ydbCourseRepository) Create(context.Context, domain.CreateCourseParams) (domain.Course, error) {
|
||||
return domain.Course{}, nil
|
||||
func createCourseParamsAsStruct(params domain.CreateCourseParams) types.Value {
|
||||
st := mapSourceTypeFromDomain(params.SourceType)
|
||||
now := time.Now()
|
||||
return types.StructValue(
|
||||
types.StructFieldValue("id", types.TextValue(params.ID)),
|
||||
types.StructFieldValue("name", types.TextValue(params.Name)),
|
||||
types.StructFieldValue("source_type", types.TextValue(st)),
|
||||
types.StructFieldValue("source_name", types.NullableTextValue(params.SourceName.ValutPtr())),
|
||||
types.StructFieldValue("external_id", types.NullableTextValue(params.ExternalID.ValutPtr())),
|
||||
types.StructFieldValue("organization_id", types.TextValue(params.OrganizationID)),
|
||||
types.StructFieldValue("origin_link", types.TextValue(params.OriginLink)),
|
||||
types.StructFieldValue("image_link", types.TextValue(params.ImageLink)),
|
||||
types.StructFieldValue("description", types.TextValue(params.Description)),
|
||||
types.StructFieldValue("full_price", types.DoubleValue(params.FullPrice)),
|
||||
types.StructFieldValue("discount", types.DoubleValue(params.Discount)),
|
||||
types.StructFieldValue("duration", types.IntervalValueFromDuration(params.Duration)),
|
||||
types.StructFieldValue("starts_at", types.DatetimeValueFromTime(params.StartsAt)),
|
||||
types.StructFieldValue("created_at", types.DatetimeValueFromTime(now)),
|
||||
types.StructFieldValue("updated_at", types.DatetimeValueFromTime(now)),
|
||||
types.StructFieldValue("deleted_at", types.NullableDatetimeValue(nil)),
|
||||
)
|
||||
}
|
||||
|
||||
func (r *ydbCourseRepository) Create(ctx context.Context, params domain.CreateCourseParams) (domain.Course, error) {
|
||||
// -- PRAGMA TablePathPrefix("courses");
|
||||
const upsertQuery = `DECLARE $courseData AS List<Struct<
|
||||
id: Text,
|
||||
external_id: Optional<Text>,
|
||||
name: Text,
|
||||
source_type: Text,
|
||||
source_name: Optional<Text>,
|
||||
organization_id: Text,
|
||||
origin_link: Text,
|
||||
image_link: Text,
|
||||
description: Text,
|
||||
full_price: Double,
|
||||
discount: Double,
|
||||
duration: Interval,
|
||||
starts_at: Datetime,
|
||||
created_at: Datetime,
|
||||
updated_at: Datetime,
|
||||
deleted_at: Optional<Datetime>>>;
|
||||
|
||||
REPLACE INTO
|
||||
courses
|
||||
SELECT
|
||||
id,
|
||||
external_id,
|
||||
name,
|
||||
source_type,
|
||||
source_name,
|
||||
organization_id,
|
||||
origin_link,
|
||||
image_link,
|
||||
description,
|
||||
full_price,
|
||||
discount,
|
||||
duration,
|
||||
starts_at,
|
||||
created_at,
|
||||
updated_at,
|
||||
deleted_at
|
||||
FROM AS_TABLE($courseData);`
|
||||
|
||||
writeTx := table.TxControl(
|
||||
table.BeginTx(
|
||||
table.WithSerializableReadWrite(),
|
||||
),
|
||||
table.CommitTx(),
|
||||
)
|
||||
err := r.db.Table().Do(ctx, func(ctx context.Context, s table.Session) error {
|
||||
queryParams := table.NewQueryParameters(
|
||||
table.ValueParam("$courseData", types.ListValue(createCourseParamsAsStruct(params))),
|
||||
)
|
||||
_, _, err := s.Execute(ctx, writeTx, upsertQuery, queryParams)
|
||||
if err != nil {
|
||||
return fmt.Errorf("executing query: %w", err)
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
|
||||
return domain.Course{}, err
|
||||
}
|
||||
|
||||
func (r *ydbCourseRepository) Delete(ctx context.Context, id string) error {
|
||||
@ -184,7 +265,7 @@ func (r *ydbCourseRepository) CreateCourseTable(ctx context.Context) error {
|
||||
return s.CreateTable(
|
||||
ctx,
|
||||
path.Join(r.db.Name(), "courses"),
|
||||
options.WithColumn("id", types.TypeString),
|
||||
options.WithColumn("id", types.TypeText),
|
||||
options.WithColumn("external_id", types.Optional(types.TypeText)),
|
||||
options.WithColumn("name", types.TypeText),
|
||||
options.WithColumn("source_type", types.TypeText),
|
||||
@ -193,8 +274,8 @@ func (r *ydbCourseRepository) CreateCourseTable(ctx context.Context) error {
|
||||
options.WithColumn("origin_link", types.TypeText),
|
||||
options.WithColumn("image_link", types.TypeText),
|
||||
options.WithColumn("description", types.TypeText),
|
||||
options.WithColumn("full_price", types.TypeFloat),
|
||||
options.WithColumn("discount", types.TypeFloat),
|
||||
options.WithColumn("full_price", types.TypeDouble),
|
||||
options.WithColumn("discount", types.TypeDouble),
|
||||
options.WithColumn("duration", types.TypeInterval),
|
||||
options.WithColumn("starts_at", types.TypeDatetime),
|
||||
options.WithColumn("created_at", types.TypeDatetime),
|
||||
@ -227,6 +308,7 @@ type courseDB struct {
|
||||
func (c *courseDB) getNamedValues() []named.Value {
|
||||
return []named.Value{
|
||||
named.Required("id", &c.ID),
|
||||
named.Required("name", &c.Name),
|
||||
named.Optional("external_id", &c.ExternalID),
|
||||
named.Required("source_type", &c.SourceType),
|
||||
named.Optional("source_name", &c.SourceName),
|
||||
@ -234,6 +316,8 @@ func (c *courseDB) getNamedValues() []named.Value {
|
||||
named.Required("origin_link", &c.OriginLink),
|
||||
named.Required("image_link", &c.ImageLink),
|
||||
named.Required("description", &c.Description),
|
||||
named.Required("full_price", &c.FullPrice),
|
||||
named.Required("discount", &c.Discount),
|
||||
named.Required("duration", &c.Duration),
|
||||
named.Required("starts_at", &c.StartAt),
|
||||
named.Required("created_at", &c.CreatedAt),
|
||||
@ -248,9 +332,8 @@ const (
|
||||
sourceTypeParsed = "p"
|
||||
)
|
||||
|
||||
func mapCourseDB(cdb courseDB) domain.Course {
|
||||
var st domain.SourceType
|
||||
switch cdb.SourceType {
|
||||
func mapSourceTypeToDomain(in string) (st domain.SourceType) {
|
||||
switch in {
|
||||
case sourceTypeUnknown:
|
||||
st = domain.SourceTypeUnset
|
||||
case sourceTypeManual:
|
||||
@ -259,6 +342,26 @@ func mapCourseDB(cdb courseDB) domain.Course {
|
||||
st = domain.SourceTypeParsed
|
||||
}
|
||||
|
||||
return st
|
||||
}
|
||||
|
||||
func mapSourceTypeFromDomain(in domain.SourceType) string {
|
||||
var st string
|
||||
switch in {
|
||||
case domain.SourceTypeManual:
|
||||
st = sourceTypeManual
|
||||
case domain.SourceTypeParsed:
|
||||
st = sourceTypeParsed
|
||||
default:
|
||||
st = sourceTypeUnknown
|
||||
}
|
||||
|
||||
return st
|
||||
}
|
||||
|
||||
func mapCourseDB(cdb courseDB) domain.Course {
|
||||
st := mapSourceTypeToDomain(cdb.SourceType)
|
||||
|
||||
return domain.Course{
|
||||
ID: cdb.ID,
|
||||
ExternalID: nullable.NewValuePtr(cdb.ExternalID),
|
||||
|
||||
@ -13,14 +13,14 @@ import (
|
||||
|
||||
type CreateCourse struct {
|
||||
ID string
|
||||
Name string
|
||||
Description string
|
||||
ExternalID nullable.Value[string]
|
||||
Name string
|
||||
SourceType domain.SourceType
|
||||
SourceName nullable.Value[string]
|
||||
OrganizationID string
|
||||
OriginLink string
|
||||
ImageLink string
|
||||
Description string
|
||||
FullPrice float64
|
||||
Discount float64
|
||||
Duration time.Duration
|
||||
|
||||
@ -15,14 +15,14 @@ type ListCoursesParams struct {
|
||||
|
||||
type CreateCourseParams struct {
|
||||
ID string
|
||||
Name string
|
||||
Description string
|
||||
ExternalID nullable.Value[string]
|
||||
Name string
|
||||
SourceType SourceType
|
||||
SourceName nullable.Value[string]
|
||||
OrganizationID string
|
||||
OriginLink string
|
||||
ImageLink string
|
||||
Description string
|
||||
FullPrice float64
|
||||
Discount float64
|
||||
Duration time.Duration
|
||||
|
||||
Reference in New Issue
Block a user