Update the property field model to interface with SQLX (#29987)
* Update the property field model to interface with SQLX * Fix tests
Этот коммит содержится в:
коммит произвёл
GitHub
родитель
bec3bbf88f
Коммит
9f172fed70
@@ -61,7 +61,7 @@ func TestGetCPAField(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
require.Equal(t, createdField.ID, fetchedField.ID)
|
||||
require.Equal(t, "Test Field", fetchedField.Name)
|
||||
require.Equal(t, map[string]any{"visibility": "hidden"}, fetchedField.Attrs)
|
||||
require.Equal(t, model.StringInterface{"visibility": "hidden"}, fetchedField.Attrs)
|
||||
})
|
||||
}
|
||||
|
||||
@@ -152,7 +152,7 @@ func TestCreateCPAField(t *testing.T) {
|
||||
require.Nil(t, err)
|
||||
require.NotZero(t, createdField.ID)
|
||||
require.Equal(t, cpaGroupID, createdField.GroupID)
|
||||
require.Equal(t, map[string]any{"visibility": "hidden"}, createdField.Attrs)
|
||||
require.Equal(t, model.StringInterface{"visibility": "hidden"}, createdField.Attrs)
|
||||
|
||||
fetchedField, gErr := th.App.Srv().propertyService.GetPropertyField(createdField.ID)
|
||||
require.NoError(t, gErr)
|
||||
|
||||
@@ -4,8 +4,6 @@
|
||||
package sqlstore
|
||||
|
||||
import (
|
||||
"database/sql"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
sq "github.com/mattermost/squirrel"
|
||||
@@ -15,103 +13,6 @@ import (
|
||||
"github.com/mattermost/mattermost/server/v8/channels/store"
|
||||
)
|
||||
|
||||
func (s *SqlPropertyFieldStore) propertyFieldToInsertMap(field *model.PropertyField) (map[string]any, error) {
|
||||
if field.Attrs == nil {
|
||||
field.Attrs = make(map[string]any)
|
||||
}
|
||||
|
||||
attrsJSON, err := json.Marshal(field.Attrs)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_to_insert_map_marshal_attrs")
|
||||
}
|
||||
if s.IsBinaryParamEnabled() {
|
||||
attrsJSON = AppendBinaryFlag(attrsJSON)
|
||||
}
|
||||
|
||||
return map[string]any{
|
||||
"ID": field.ID,
|
||||
"GroupID": field.GroupID,
|
||||
"Name": field.Name,
|
||||
"Type": field.Type,
|
||||
"Attrs": attrsJSON,
|
||||
"TargetID": field.TargetID,
|
||||
"TargetType": field.TargetType,
|
||||
"CreateAt": field.CreateAt,
|
||||
"UpdateAt": field.UpdateAt,
|
||||
"DeleteAt": field.DeleteAt,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func (s *SqlPropertyFieldStore) propertyFieldToUpdateMap(field *model.PropertyField) (map[string]any, error) {
|
||||
if field.Attrs == nil {
|
||||
field.Attrs = make(map[string]any)
|
||||
}
|
||||
|
||||
attrsJSON, err := json.Marshal(field.Attrs)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_to_update_map_marshal_attrs")
|
||||
}
|
||||
if s.IsBinaryParamEnabled() {
|
||||
attrsJSON = AppendBinaryFlag(attrsJSON)
|
||||
}
|
||||
|
||||
return map[string]any{
|
||||
"Name": field.Name,
|
||||
"Type": field.Type,
|
||||
"Attrs": attrsJSON,
|
||||
"TargetID": field.TargetID,
|
||||
"TargetType": field.TargetType,
|
||||
"UpdateAt": field.UpdateAt,
|
||||
"DeleteAt": field.DeleteAt,
|
||||
}, nil
|
||||
}
|
||||
|
||||
func propertyFieldsFromRows(rows *sql.Rows) ([]*model.PropertyField, error) {
|
||||
results := []*model.PropertyField{}
|
||||
|
||||
for rows.Next() {
|
||||
var field model.PropertyField
|
||||
var attrsJSON string
|
||||
|
||||
err := rows.Scan(
|
||||
&field.ID,
|
||||
&field.GroupID,
|
||||
&field.Name,
|
||||
&field.Type,
|
||||
&attrsJSON,
|
||||
&field.TargetID,
|
||||
&field.TargetType,
|
||||
&field.CreateAt,
|
||||
&field.UpdateAt,
|
||||
&field.DeleteAt,
|
||||
)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if err := json.Unmarshal([]byte(attrsJSON), &field.Attrs); err != nil {
|
||||
return nil, errors.Wrap(err, "property_fields_from_rows_unmarshal_attrs")
|
||||
}
|
||||
|
||||
results = append(results, &field)
|
||||
}
|
||||
|
||||
return results, nil
|
||||
}
|
||||
|
||||
func propertyFieldFromRows(rows *sql.Rows) (*model.PropertyField, error) {
|
||||
fields, err := propertyFieldsFromRows(rows)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
if len(fields) > 0 {
|
||||
return fields[0], nil
|
||||
}
|
||||
|
||||
return nil, sql.ErrNoRows
|
||||
}
|
||||
|
||||
type SqlPropertyFieldStore struct {
|
||||
*SqlStore
|
||||
|
||||
@@ -139,14 +40,10 @@ func (s *SqlPropertyFieldStore) Create(field *model.PropertyField) (*model.Prope
|
||||
return nil, errors.Wrap(err, "property_field_create_isvalid")
|
||||
}
|
||||
|
||||
insertMap, err := s.propertyFieldToInsertMap(field)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
builder := s.getQueryBuilder().
|
||||
Insert("PropertyFields").
|
||||
SetMap(insertMap)
|
||||
Columns("ID", "GroupID", "Name", "Type", "Attrs", "TargetID", "TargetType", "CreateAt", "UpdateAt", "DeleteAt").
|
||||
Values(field.ID, field.GroupID, field.Name, field.Type, field.Attrs, field.TargetID, field.TargetType, field.CreateAt, field.UpdateAt, field.DeleteAt)
|
||||
|
||||
if _, err := s.GetMaster().ExecBuilder(builder); err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_create_insert")
|
||||
@@ -156,45 +53,23 @@ func (s *SqlPropertyFieldStore) Create(field *model.PropertyField) (*model.Prope
|
||||
}
|
||||
|
||||
func (s *SqlPropertyFieldStore) Get(id string) (*model.PropertyField, error) {
|
||||
queryString, args, err := s.tableSelectQuery.
|
||||
Where(sq.Eq{"id": id}).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_tosql")
|
||||
}
|
||||
builder := s.tableSelectQuery.Where(sq.Eq{"id": id})
|
||||
|
||||
rows, err := s.GetReplica().Query(queryString, args...)
|
||||
if err != nil {
|
||||
var field model.PropertyField
|
||||
if err := s.GetReplica().GetBuilder(&field, builder); err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_select")
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
field, err := propertyFieldFromRows(rows)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_propertyfieldfromrows")
|
||||
}
|
||||
|
||||
return field, nil
|
||||
return &field, nil
|
||||
}
|
||||
|
||||
func (s *SqlPropertyFieldStore) GetMany(ids []string) ([]*model.PropertyField, error) {
|
||||
queryString, args, err := s.tableSelectQuery.
|
||||
Where(sq.Eq{"id": ids}).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_many_tosql")
|
||||
}
|
||||
builder := s.tableSelectQuery.Where(sq.Eq{"id": ids})
|
||||
|
||||
rows, err := s.GetReplica().Query(queryString, args...)
|
||||
if err != nil {
|
||||
fields := []*model.PropertyField{}
|
||||
if err := s.GetReplica().SelectBuilder(&fields, builder); err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_many_query")
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
fields, err := propertyFieldsFromRows(rows)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_get_many_propertyfieldfromrows")
|
||||
}
|
||||
|
||||
if len(fields) < len(ids) {
|
||||
return nil, fmt.Errorf("missmatch results: got %d results of the %d ids passed", len(fields), len(ids))
|
||||
@@ -212,42 +87,31 @@ func (s *SqlPropertyFieldStore) SearchPropertyFields(opts model.PropertyFieldSea
|
||||
return nil, errors.New("per page must be positive integer greater than zero")
|
||||
}
|
||||
|
||||
query := s.tableSelectQuery.
|
||||
builder := s.tableSelectQuery.
|
||||
OrderBy("CreateAt ASC").
|
||||
Offset(uint64(opts.Page * opts.PerPage)).
|
||||
Limit(uint64(opts.PerPage))
|
||||
|
||||
if !opts.IncludeDeleted {
|
||||
query = query.Where(sq.Eq{"DeleteAt": 0})
|
||||
builder = builder.Where(sq.Eq{"DeleteAt": 0})
|
||||
}
|
||||
|
||||
if opts.GroupID != "" {
|
||||
query = query.Where(sq.Eq{"GroupID": opts.GroupID})
|
||||
builder = builder.Where(sq.Eq{"GroupID": opts.GroupID})
|
||||
}
|
||||
|
||||
if opts.TargetType != "" {
|
||||
query = query.Where(sq.Eq{"TargetType": opts.TargetType})
|
||||
builder = builder.Where(sq.Eq{"TargetType": opts.TargetType})
|
||||
}
|
||||
|
||||
if opts.TargetID != "" {
|
||||
query = query.Where(sq.Eq{"TargetID": opts.TargetID})
|
||||
builder = builder.Where(sq.Eq{"TargetID": opts.TargetID})
|
||||
}
|
||||
|
||||
queryString, args, err := query.ToSql()
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_search_tosql")
|
||||
}
|
||||
|
||||
rows, err := s.GetReplica().Query(queryString, args...)
|
||||
if err != nil {
|
||||
fields := []*model.PropertyField{}
|
||||
if err := s.GetReplica().SelectBuilder(&fields, builder); err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_search_query")
|
||||
}
|
||||
defer rows.Close()
|
||||
|
||||
fields, err := propertyFieldsFromRows(rows)
|
||||
if err != nil {
|
||||
return nil, errors.Wrap(err, "property_field_search_propertyfieldfromrows")
|
||||
}
|
||||
|
||||
return fields, nil
|
||||
}
|
||||
@@ -271,14 +135,15 @@ func (s *SqlPropertyFieldStore) Update(fields []*model.PropertyField) (_ []*mode
|
||||
return nil, errors.Wrap(vErr, "property_field_update_isvalid")
|
||||
}
|
||||
|
||||
updateMap, err := s.propertyFieldToUpdateMap(field)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
queryString, args, err := s.getQueryBuilder().
|
||||
Update("PropertyFields").
|
||||
SetMap(updateMap).
|
||||
Set("Name", field.Name).
|
||||
Set("Type", field.Type).
|
||||
Set("Attrs", field.Attrs).
|
||||
Set("TargetID", field.TargetID).
|
||||
Set("TargetType", field.TargetType).
|
||||
Set("UpdateAt", field.UpdateAt).
|
||||
Set("DeleteAt", field.DeleteAt).
|
||||
Where(sq.Eq{"id": field.ID}).
|
||||
ToSql()
|
||||
if err != nil {
|
||||
|
||||
@@ -24,7 +24,7 @@ type PropertyField struct {
|
||||
GroupID string `json:"group_id"`
|
||||
Name string `json:"name"`
|
||||
Type PropertyFieldType `json:"type"`
|
||||
Attrs map[string]any `json:"attrs"`
|
||||
Attrs StringInterface `json:"attrs"`
|
||||
TargetID string `json:"target_id"`
|
||||
TargetType string `json:"target_type"`
|
||||
CreateAt int64 `json:"create_at"`
|
||||
|
||||
Ссылка в новой задаче
Block a user