Add O-counter (#334)

* Add backend support for o-counter

* Add o-counter buttons everywhere

* Put o-counter button right-aligned on tabs

* Add o-counter filter
This commit is contained in:
WithoutPants
2020-02-03 11:17:28 +11:00
committed by GitHub
parent 066295f0c9
commit f87117b0d6
22 changed files with 325 additions and 9 deletions

View File

@@ -422,3 +422,63 @@ func changeMarker(ctx context.Context, changeType int, changedMarker models.Scen
return sceneMarker, nil
}
func (r *mutationResolver) SceneIncrementO(ctx context.Context, id string) (int, error) {
sceneID, _ := strconv.Atoi(id)
tx := database.DB.MustBeginTx(ctx, nil)
qb := models.NewSceneQueryBuilder()
newVal, err := qb.IncrementOCounter(sceneID, tx)
if err != nil {
_ = tx.Rollback()
return 0, err
}
// Commit
if err := tx.Commit(); err != nil {
return 0, err
}
return newVal, nil
}
func (r *mutationResolver) SceneDecrementO(ctx context.Context, id string) (int, error) {
sceneID, _ := strconv.Atoi(id)
tx := database.DB.MustBeginTx(ctx, nil)
qb := models.NewSceneQueryBuilder()
newVal, err := qb.DecrementOCounter(sceneID, tx)
if err != nil {
_ = tx.Rollback()
return 0, err
}
// Commit
if err := tx.Commit(); err != nil {
return 0, err
}
return newVal, nil
}
func (r *mutationResolver) SceneResetO(ctx context.Context, id string) (int, error) {
sceneID, _ := strconv.Atoi(id)
tx := database.DB.MustBeginTx(ctx, nil)
qb := models.NewSceneQueryBuilder()
newVal, err := qb.ResetOCounter(sceneID, tx)
if err != nil {
_ = tx.Rollback()
return 0, err
}
// Commit
if err := tx.Commit(); err != nil {
return 0, err
}
return newVal, nil
}

View File

@@ -17,7 +17,7 @@ import (
)
var DB *sqlx.DB
var appSchemaVersion uint = 2
var appSchemaVersion uint = 3
const sqlite3Driver = "sqlite3_regexp"

View File

@@ -0,0 +1 @@
ALTER TABLE `scenes` ADD COLUMN `o_counter` tinyint not null default 0;

View File

@@ -15,6 +15,7 @@ type Scene struct {
URL sql.NullString `db:"url" json:"url"`
Date SQLiteDate `db:"date" json:"date"`
Rating sql.NullInt64 `db:"rating" json:"rating"`
OCounter int `db:"o_counter" json:"o_counter"`
Size sql.NullString `db:"size" json:"size"`
Duration sql.NullFloat64 `db:"duration" json:"duration"`
VideoCodec sql.NullString `db:"video_codec" json:"video_codec"`

View File

@@ -76,6 +76,60 @@ func (qb *SceneQueryBuilder) Update(updatedScene ScenePartial, tx *sqlx.Tx) (*Sc
return qb.find(updatedScene.ID, tx)
}
func (qb *SceneQueryBuilder) IncrementOCounter(id int, tx *sqlx.Tx) (int, error) {
ensureTx(tx)
_, err := tx.Exec(
`UPDATE scenes SET o_counter = o_counter + 1 WHERE scenes.id = ?`,
id,
)
if err != nil {
return 0, err
}
scene, err := qb.find(id, tx)
if err != nil {
return 0, err
}
return scene.OCounter, nil
}
func (qb *SceneQueryBuilder) DecrementOCounter(id int, tx *sqlx.Tx) (int, error) {
ensureTx(tx)
_, err := tx.Exec(
`UPDATE scenes SET o_counter = o_counter - 1 WHERE scenes.id = ? and scenes.o_counter > 0`,
id,
)
if err != nil {
return 0, err
}
scene, err := qb.find(id, tx)
if err != nil {
return 0, err
}
return scene.OCounter, nil
}
func (qb *SceneQueryBuilder) ResetOCounter(id int, tx *sqlx.Tx) (int, error) {
ensureTx(tx)
_, err := tx.Exec(
`UPDATE scenes SET o_counter = 0 WHERE scenes.id = ?`,
id,
)
if err != nil {
return 0, err
}
scene, err := qb.find(id, tx)
if err != nil {
return 0, err
}
return scene.OCounter, nil
}
func (qb *SceneQueryBuilder) Destroy(id string, tx *sqlx.Tx) error {
return executeDeleteQuery("scenes", id, tx)
}
@@ -178,6 +232,14 @@ func (qb *SceneQueryBuilder) Query(sceneFilter *SceneFilterType, findFilter *Fin
}
}
if oCounter := sceneFilter.OCounter; oCounter != nil {
clause, count := getIntCriterionWhereClause("scenes.o_counter", *sceneFilter.OCounter)
whereClauses = append(whereClauses, clause)
if count == 1 {
args = append(args, sceneFilter.OCounter.Value)
}
}
if durationFilter := sceneFilter.Duration; durationFilter != nil {
clause, thisArgs := getDurationWhereClause(*durationFilter)
whereClauses = append(whereClauses, clause)

View File

@@ -95,7 +95,7 @@ func getSort(sort string, direction string, tableName string) string {
const randomSeedPrefix = "random_"
if strings.Contains(sort, "_count") {
if strings.HasSuffix(sort, "_count") {
var relationTableName = strings.Split(sort, "_")[0] // TODO: pluralize?
colName := getColumn(relationTableName, "id")
return " ORDER BY COUNT(distinct " + colName + ") " + direction