added command with interactive dialog
Some checks failed
ci / plugin-ci (push) Has been cancelled

This commit is contained in:
Felipe M 2024-08-08 15:52:29 +02:00
parent 09c4f13f2c
commit 2d962d18d2
Signed by: fmartingr
GPG key ID: CCFBC5637D4000A8
16 changed files with 520 additions and 89 deletions

53
server/sqlstore/file.go Normal file
View file

@ -0,0 +1,53 @@
package sqlstore
import (
"context"
"fmt"
"time"
sq "github.com/Masterminds/squirrel"
"github.com/mattermost/mattermost/server/public/model"
)
const (
fileInfoTable = "FileInfo"
)
func (s *SQLStore) DetatchAttachmentFromChannel(fileID string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
update := map[string]interface{}{
"ChannelId": "",
"PostId": "",
"DeleteAt": model.GetMillis(),
}
query := s.masterBuilder.
Update(fileInfoTable).
SetMap(update).
Where(sq.Eq{"Id": fileID})
tx, err := s.master.Begin()
if err != nil {
return fmt.Errorf("error starting transaction: %w", err)
}
q, args, err := query.ToSql()
if err != nil {
return fmt.Errorf("error creating query: %w", err)
}
_, err = tx.ExecContext(ctx, q, args...)
if err != nil {
s.logger.Error("error detaching attachment from channel", "fileId", fileID, "err", err)
return tx.Rollback()
}
if err := tx.Commit(); err != nil {
return fmt.Errorf("error committing transaction: %w", err)
}
return nil
}

51
server/sqlstore/post.go Normal file
View file

@ -0,0 +1,51 @@
package sqlstore
import (
"context"
"encoding/json"
"fmt"
"time"
sq "github.com/Masterminds/squirrel"
)
const (
postsTable = "Posts"
)
func (s *SQLStore) AttachFileIDsToPost(postID string, fileIDs []string) error {
ctx, cancel := context.WithTimeout(context.Background(), time.Second*5)
defer cancel()
fileIDsJSON, err := json.Marshal(fileIDs)
if err != nil {
return fmt.Errorf("error marshaling fileIds: %w", err)
}
query := s.masterBuilder.
Update(postsTable).
Set("FileIds", fileIDsJSON).
Where(sq.Eq{"Id": postID})
tx, err := s.master.Begin()
if err != nil {
return fmt.Errorf("error starting transaction: %w", err)
}
q, args, err := query.ToSql()
if err != nil {
return fmt.Errorf("error creating query: %w", err)
}
_, err = tx.ExecContext(ctx, q, args...)
if err != nil {
s.logger.Error("error attaching file to post", "postId", postID, "err", err)
return tx.Rollback()
}
if err := tx.Commit(); err != nil {
return fmt.Errorf("error committing transaction: %w", err)
}
return nil
}

79
server/sqlstore/store.go Normal file
View file

@ -0,0 +1,79 @@
package sqlstore
import (
"database/sql"
sq "github.com/Masterminds/squirrel"
"github.com/jmoiron/sqlx"
"github.com/mattermost/mattermost/server/public/model"
)
type Source interface {
GetMasterDB() (*sql.DB, error)
GetReplicaDB() (*sql.DB, error)
DriverName() string
}
type Logger interface {
Error(message string, keyValuePairs ...interface{})
Warn(message string, keyValuePairs ...interface{})
Info(message string, keyValuePairs ...interface{})
Debug(message string, keyValuePairs ...interface{})
}
type SQLStore struct {
src Source
master *sqlx.DB
replica *sqlx.DB
masterBuilder sq.StatementBuilderType
replicaBuilder sq.StatementBuilderType
logger Logger
}
// New constructs a new instance of SQLStore.
func New(src Source, logger Logger) (*SQLStore, error) {
var master, replica *sqlx.DB
masterDB, err := src.GetMasterDB()
if err != nil {
return nil, err
}
master = sqlx.NewDb(masterDB, src.DriverName())
replicaDB, err := src.GetReplicaDB()
if err != nil {
return nil, err
}
replica = sqlx.NewDb(replicaDB, src.DriverName())
masterBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
if src.DriverName() == model.DatabaseDriverPostgres {
masterBuilder = masterBuilder.PlaceholderFormat(sq.Dollar)
}
if src.DriverName() == model.DatabaseDriverMysql {
master.MapperFunc(func(s string) string { return s })
}
masterBuilder = masterBuilder.RunWith(master)
replicaBuilder := sq.StatementBuilder.PlaceholderFormat(sq.Question)
if src.DriverName() == model.DatabaseDriverPostgres {
replicaBuilder = replicaBuilder.PlaceholderFormat(sq.Dollar)
}
if src.DriverName() == model.DatabaseDriverMysql {
replica.MapperFunc(func(s string) string { return s })
}
replicaBuilder = replicaBuilder.RunWith(replica)
return &SQLStore{
src,
master,
replica,
masterBuilder,
replicaBuilder,
logger,
}, nil
}