diff --git a/server/channels/app/custom_profile_attributes_test.go b/server/channels/app/custom_profile_attributes_test.go index 8af131dbac..bf0ba4e9f2 100644 --- a/server/channels/app/custom_profile_attributes_test.go +++ b/server/channels/app/custom_profile_attributes_test.go @@ -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) diff --git a/server/channels/store/sqlstore/property_field_store.go b/server/channels/store/sqlstore/property_field_store.go index 55ac707d81..c434f1702b 100644 --- a/server/channels/store/sqlstore/property_field_store.go +++ b/server/channels/store/sqlstore/property_field_store.go @@ -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 { diff --git a/server/public/model/property_field.go b/server/public/model/property_field.go index 8aaab551f3..2317a06b5d 100644 --- a/server/public/model/property_field.go +++ b/server/public/model/property_field.go @@ -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"`