You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
48 lines
1.6 KiB
48 lines
1.6 KiB
|
4 weeks ago
|
-- Un usuario solo puede tener un carrito. Antes había únicamente un índice no
|
||
|
|
-- único y dos primeras peticiones simultáneas podían crear dos carritos.
|
||
|
|
--
|
||
|
|
-- La migración conserva el carrito más antiguo de cada usuario, copia en él
|
||
|
|
-- los elementos de los demás y elimina los duplicados antes de crear la guarda.
|
||
|
|
|
||
|
|
WITH canonicos AS (
|
||
|
|
SELECT usuario_id, min(creado_en) AS primera_fecha
|
||
|
|
FROM carrito
|
||
|
|
WHERE usuario_id IS NOT NULL
|
||
|
|
GROUP BY usuario_id
|
||
|
|
), elegidos AS (
|
||
|
|
SELECT c.usuario_id, min(c.id) AS carrito_id
|
||
|
|
FROM carrito c
|
||
|
|
INNER JOIN canonicos x
|
||
|
|
ON x.usuario_id = c.usuario_id AND x.primera_fecha = c.creado_en
|
||
|
|
GROUP BY c.usuario_id
|
||
|
|
)
|
||
|
|
INSERT INTO carrito_item (carrito_id, cancion_id, anadido_en)
|
||
|
|
SELECT e.carrito_id, ci.cancion_id, min(ci.anadido_en)
|
||
|
|
FROM carrito c
|
||
|
|
INNER JOIN elegidos e ON e.usuario_id = c.usuario_id
|
||
|
|
INNER JOIN carrito_item ci ON ci.carrito_id = c.id
|
||
|
|
WHERE c.id <> e.carrito_id
|
||
|
|
GROUP BY e.carrito_id, ci.cancion_id
|
||
|
|
ON CONFLICT (carrito_id, cancion_id) DO NOTHING;--> statement-breakpoint
|
||
|
|
|
||
|
|
WITH canonicos AS (
|
||
|
|
SELECT usuario_id, min(creado_en) AS primera_fecha
|
||
|
|
FROM carrito
|
||
|
|
WHERE usuario_id IS NOT NULL
|
||
|
|
GROUP BY usuario_id
|
||
|
|
), elegidos AS (
|
||
|
|
SELECT c.usuario_id, min(c.id) AS carrito_id
|
||
|
|
FROM carrito c
|
||
|
|
INNER JOIN canonicos x
|
||
|
|
ON x.usuario_id = c.usuario_id AND x.primera_fecha = c.creado_en
|
||
|
|
GROUP BY c.usuario_id
|
||
|
|
)
|
||
|
|
DELETE FROM carrito c
|
||
|
|
USING elegidos e
|
||
|
|
WHERE c.usuario_id = e.usuario_id AND c.id <> e.carrito_id;--> statement-breakpoint
|
||
|
|
|
||
|
|
DROP INDEX IF EXISTS "carrito_usuario";--> statement-breakpoint
|
||
|
|
CREATE UNIQUE INDEX "carrito_usuario_unico"
|
||
|
|
ON "carrito" ("usuario_id")
|
||
|
|
WHERE "usuario_id" IS NOT NULL;
|