fleet/server/datastore/mysql/software_title_display_names.go
Jahziel Villasana-Espinoza 1cf16f0539
software display names: DB changes (#35066)
<!-- Add the related story/sub-task/bug number, like Resolves #123, or
remove if NA -->
**Related issue:** Resolves #33776 

# Checklist for submitter

If some of the following don't apply, delete the relevant line.

- [x] Input data is properly validated, `SELECT *` is avoided, SQL
injection is prevented (using placeholders for values in statements)

## Testing

- [x] Added/updated automated tests
- [x] QA'd all new/changed functionality manually

## Database migrations

- [x] Checked schema for all modified table for columns that will
auto-update timestamps during migration.
- [x] Ensured the correct collation is explicitly set for character
columns (`COLLATE utf8mb4_unicode_ci`).
2025-11-04 10:04:42 -05:00

78 lines
2.2 KiB
Go

package mysql
import (
"context"
"database/sql"
"github.com/fleetdm/fleet/v4/server/contexts/ctxerr"
"github.com/jmoiron/sqlx"
)
func updateSoftwareTitleDisplayName(ctx context.Context, tx sqlx.ExtContext, teamID *uint, titleID uint, displayName string) error {
var tmID uint
if teamID != nil {
tmID = *teamID
}
_, err := tx.ExecContext(ctx, `
INSERT INTO software_title_display_names
(team_id, software_title_id, display_name)
VALUES (?, ?, ?)
ON DUPLICATE KEY UPDATE
display_name = VALUES(display_name)`, tmID, titleID, displayName)
if err != nil {
return err
}
return nil
}
func (ds *Datastore) getDisplayNamesByTeamAndTitleIds(ctx context.Context, teamID uint, titleIDs []uint) (map[uint]string, error) {
if len(titleIDs) == 0 {
return map[uint]string{}, nil
}
var args []any
query := `
SELECT software_title_id, display_name
FROM software_title_display_names
WHERE software_title_id IN (?) AND team_id = ?
`
query, args, err := sqlx.In(query, titleIDs, teamID)
if err != nil {
return nil, ctxerr.Wrap(ctx, err, "building query for get software title display names")
}
var results []struct {
SoftwareTitleID uint `db:"software_title_id"`
DisplayName string `db:"display_name"`
}
if err := sqlx.SelectContext(ctx, ds.reader(ctx), &results, query, args...); err != nil {
return nil, ctxerr.Wrap(ctx, err, "get software title display names")
}
iconsBySoftwareTitleID := make(map[uint]string, len(results))
for _, r := range results {
iconsBySoftwareTitleID[r.SoftwareTitleID] = r.DisplayName
}
return iconsBySoftwareTitleID, nil
}
func (ds *Datastore) getSoftwareTitleDisplayName(ctx context.Context, teamID uint, titleID uint) (string, error) {
args := []any{teamID, titleID}
query := `
SELECT display_name
FROM software_title_display_names
WHERE team_id = ? AND software_title_id = ?
`
var displayName string
err := sqlx.GetContext(ctx, ds.reader(ctx), &displayName, query, args...)
if err != nil {
if err == sql.ErrNoRows {
return "", ctxerr.Wrap(ctx, notFound("SoftwareTitleDisplayName"), "get software title display name")
}
return "", ctxerr.Wrap(ctx, err, "get software title display name")
}
return displayName, nil
}