fix(publish): 最终审查修复波——迁移索引口径 / 入库计数 / 仓储证据
C1(关键):2026-09-22-03 的街拍实体键索引改用最终表达式 (city, year, COALESCE(title, '')),与体检及 StreetSnapEntityState 口径一致。 此前索引按 (city, year) 比体检更窄,同城同年多专题的合法数据会通过体检、 再由索引抛原生 23505;04 退化为幂等兜底并在注释说明真正常态由 03 承载。 新增 db/migrations/README.md,写清迁移链执行顺序与各步前提/不可逆点。 I1:processRunway 的 image_count 改为按实际落库主图行数(countMainImages), 不再用 len(p.Looks)(空主图 / sha1 重复会被跳过,导致计数偏大且不再自愈)。 补 service 单测与「入库后 image_count == 存活主图行数」的 DB 断言。 I2:三个迁移文件不再把已删除的一次性搬迁脚本写成硬前置,改为写明取回方式 (git show c4bafc5:scripts/migrate_single_table/main.go,并须在旧代码树上运行)。 I3:新增 SetRecordStatus / SetStreetRecordStatus 仓储集成测试: pending 经仓储通过后在公开视图可见、驳回后不可见、不存在的 id 返回 ErrNotFound。 Minor:修正锁不住口径的走秀 image_count 测试(改为删主图、留细节图); 修正去重注释与事实不符(含 FindNearDuplicateImage 注释); ListRecords / ListStreetRecords 改用 Scope 杜绝 Count 后复用 *gorm.DB; dbtool 视图改 CREATE OR REPLACE 并重跑 dump(仍 4 视图、无草稿表); 删除挂在 Popular 上的「IDs 返回…」注释;README 改为单表 + status 现状; SetRecordStatus 注释写明有意不校验前置状态;规格补两条已知不一致。
This commit is contained in:
63
db_dump.sql
63
db_dump.sql
@ -1,5 +1,5 @@
|
||||
-- dbtool 导出:127.0.0.1:5432/fashion
|
||||
-- 生成时间:2026-09-23T14:06:13+08:00
|
||||
-- 生成时间:2026-09-23T15:56:58+08:00
|
||||
--
|
||||
-- 导入(二选一):
|
||||
-- dbtool import -in <本文件>
|
||||
@ -171,7 +171,7 @@ CREATE TABLE IF NOT EXISTS public."users" (
|
||||
"tier" character varying(16)
|
||||
);
|
||||
|
||||
CREATE VIEW public."public_brand_runway_images" AS
|
||||
CREATE OR REPLACE VIEW public."public_brand_runway_images" AS
|
||||
SELECT i.id,
|
||||
i.created_at,
|
||||
i.updated_at,
|
||||
@ -190,7 +190,7 @@ SELECT i.id,
|
||||
JOIN brand_runways r ON r.id = i.runway_id
|
||||
WHERE i.is_deleted = 0 AND r.status::text = 'published'::text AND r.is_deleted = 0;
|
||||
|
||||
CREATE VIEW public."public_brand_runways" AS
|
||||
CREATE OR REPLACE VIEW public."public_brand_runways" AS
|
||||
SELECT brand_runways.id,
|
||||
brand_runways.title_en,
|
||||
brand_runways.title_cn,
|
||||
@ -213,7 +213,7 @@ SELECT brand_runways.id,
|
||||
FROM brand_runways
|
||||
WHERE brand_runways.status::text = 'published'::text AND brand_runways.is_deleted = 0;
|
||||
|
||||
CREATE VIEW public."public_street_snap_images" AS
|
||||
CREATE OR REPLACE VIEW public."public_street_snap_images" AS
|
||||
SELECT i.id,
|
||||
i.snap_id,
|
||||
i.image,
|
||||
@ -231,7 +231,7 @@ SELECT i.id,
|
||||
JOIN street_snaps s ON s.id = i.snap_id
|
||||
WHERE i.is_deleted = 0 AND s.status::text = 'published'::text AND s.is_deleted = 0;
|
||||
|
||||
CREATE VIEW public."public_street_snaps" AS
|
||||
CREATE OR REPLACE VIEW public."public_street_snaps" AS
|
||||
SELECT street_snaps.id,
|
||||
street_snaps.title,
|
||||
street_snaps.year,
|
||||
@ -1200,28 +1200,6 @@ INSERT INTO public."ingest_nonces" ("nonce", "created_at") VALUES
|
||||
(E'7cac48bc88a16238f03a3c92eeded6e8', E'1789912739');
|
||||
|
||||
INSERT INTO public."refresh_tokens" ("id", "user_id", "token_hash", "expires_at", "revoked", "created_at") VALUES
|
||||
(E'1', E'7', E'a6d40efa41eb7184626615404d62eec90837387fd9c0fab4b2e4998f99116641', E'1790768077', E'1', E'1788176077'),
|
||||
(E'2', E'7', E'294f4f0e9a3933bc0a346a650e9c2229c73351f23073f4826de864c60aae7ab3', E'1790768092', E'1', E'1788176092'),
|
||||
(E'3', E'7', E'1b5cb599d3cb5f34e154e1a30ed531f6bb60899a0f4eb7baa1ece97a2b0b8922', E'1790769528', E'1', E'1788177528'),
|
||||
(E'4', E'7', E'4f53b8a0dcf701a2935e2616ca183e1538fab999fd2d282ec5efb347c130772f', E'1790769528', E'1', E'1788177528'),
|
||||
(E'9', E'7', E'43e9ab9901f7e3a3ca79e581195666c0a298a0cdaaa08655ccdd7b1e8995e68a', E'1790907621', E'1', E'1788315621'),
|
||||
(E'10', E'7', E'ee69982285607bcda68c297be3826cf17aebe16ee5d5eb354846d5f848ce1644', E'1790913746', E'1', E'1788321746'),
|
||||
(E'11', E'7', E'82980a5eb43432b294fe98e0ace622da74e8b60349a8a82be416972d19505017', E'1790913779', E'1', E'1788321779'),
|
||||
(E'12', E'7', E'2a28617d4931e139b76c6bece9ed89544984c14349e758163870dc38289b7279', E'1790923131', E'1', E'1788331131'),
|
||||
(E'13', E'7', E'4736dcf29020280cd3a7824ebbcea35cefa5e019bb6b9f2c9f98a596f4e09057', E'1790923500', E'1', E'1788331500'),
|
||||
(E'14', E'7', E'18627461e72af8e993f801933fd287a46f259f6fddd18dbd98a00730bf744b52', E'1790923558', E'1', E'1788331558'),
|
||||
(E'15', E'7', E'a25ae2038941445a00858015f043d04b9d2a25cfaf22020c30790d0054090b84', E'1790923951', E'1', E'1788331951'),
|
||||
(E'16', E'7', E'b1a72a023fb3ceb71534b5e91b53b98df197a1f807d0644746971075dc0d4135', E'1790923962', E'1', E'1788331962'),
|
||||
(E'17', E'7', E'876f4d75315a134c598aaf8afd5081f88489dc923a8fc5c23be6600c61625910', E'1790923982', E'1', E'1788331982'),
|
||||
(E'18', E'7', E'1f05e0f60671db96c68936b93dbbe3fd3f6444cd4b90867e0a8e8b450d97ea22', E'1790924007', E'1', E'1788332007'),
|
||||
(E'19', E'7', E'd2a0239104b52086cfd2cb6aec5ba64f967b4a4b1f61ce25cc3b32762c734561', E'1790924072', E'1', E'1788332072'),
|
||||
(E'20', E'7', E'fc81e702b009efee38d47f1dea0e9644885b4cbec52dac9e5c60c03f4858fa0e', E'1790924658', E'1', E'1788332658'),
|
||||
(E'21', E'7', E'bd55e380968376e1881fc6df846384c9fce9711290be367a65001c96f044799d', E'1790926919', E'1', E'1788334919'),
|
||||
(E'22', E'7', E'51cef85f469027417dc994e5d977efd1a318dc75ae0804bbfc3e019456248bd6', E'1790927021', E'1', E'1788335021'),
|
||||
(E'24', E'7', E'b180038e3448f8697f983c3ba2efb93acd7037df03fa27574ac9dceeba189f4c', E'1790928286', E'1', E'1788336286'),
|
||||
(E'29', E'7', E'22af98693b2caec27e958713b914414d8cf5f306101d53226c9d04dc6754b671', E'1790930929', E'1', E'1788338929'),
|
||||
(E'34', E'7', E'09bdc1a3388e2b09114339ac5a798b3b060a0d880d4d5a3b9e358a1a976dc703', E'1790934593', E'1', E'1788342593'),
|
||||
(E'35', E'7', E'a3ba322c3161d576afe7b2a3275cca4e215a91ee0768718f9aa841bc219f37bc', E'1790934604', E'0', E'1788342604'),
|
||||
(E'5', E'8', E'f1aea9e5697279b829720413ee5a3c76103518fe3e9dcb52174c183752df295c', E'1790822496', E'1', E'1788230496'),
|
||||
(E'6', E'8', E'338847c9c29f629e2a50e384a21b7bf29f43ccddb2a180581dd9e22f6a860b9a', E'1790824208', E'1', E'1788232208'),
|
||||
(E'7', E'8', E'9d554202fa31afdf13bf155e8115cbb3ee576d6ea7b5469de6709fbd73ad811c', E'1790848458', E'1', E'1788256458'),
|
||||
@ -1299,8 +1277,7 @@ INSERT INTO public."refresh_tokens" ("id", "user_id", "token_hash", "expires_at"
|
||||
(E'37', E'8', E'8c819c48e7f17a248791390937c488a94fd7c4c7822907900a80f24ff086e394', E'1790938015', E'1', E'1788346015'),
|
||||
(E'38', E'8', E'1e33cf9f6036efc21bbf28657577290087f8105d76c917f16f320d7cf25f8278', E'1790938336', E'1', E'1788346336'),
|
||||
(E'39', E'8', E'77962d61a0c55d79de83e31e4efded50e565ca0d09c2f4554c1108e4aecef547', E'1790939501', E'1', E'1788347501'),
|
||||
(E'40', E'8', E'c54cf2aececa5fd06701dd6fe2f9ee159f1046a5dd8818eec682498d7ec21a33', E'1790939520', E'1', E'1788347520');
|
||||
INSERT INTO public."refresh_tokens" ("id", "user_id", "token_hash", "expires_at", "revoked", "created_at") VALUES
|
||||
(E'40', E'8', E'c54cf2aececa5fd06701dd6fe2f9ee159f1046a5dd8818eec682498d7ec21a33', E'1790939520', E'1', E'1788347520'),
|
||||
(E'41', E'8', E'b02994a50c903252e72ea078dc052a535069fe0a814df4de30d4aec57392ed0e', E'1790940991', E'1', E'1788348991'),
|
||||
(E'42', E'8', E'0994a166bfe5a917d66da3d28e853991a724bad5ba2a56d0589b9f6e93f8ea8c', E'1790941592', E'1', E'1788349592'),
|
||||
(E'43', E'8', E'941b4c59118ba58915a02f0ae4250b9ba8a0816b62b9a57e2203374b8741b035', E'1790941855', E'1', E'1788349855'),
|
||||
@ -1318,7 +1295,31 @@ INSERT INTO public."refresh_tokens" ("id", "user_id", "token_hash", "expires_at"
|
||||
(E'113', E'8', E'6b6a514221de8aa4c0fda45fa6c9d6eab318aeb3ae8f72c37eec1100e11ffb73', E'1792114905', E'1', E'1789522905'),
|
||||
(E'114', E'8', E'68af59790a958f09d2fe65728fdae7cf01ea59b40b99f1cd69977a4eefce3919', E'1792415160', E'1', E'1789823160'),
|
||||
(E'115', E'8', E'6cc47083bd5373028aba68c89c0050ab2d691ee65e20993d50e8002cc500a1ba', E'1792415169', E'1', E'1789823169'),
|
||||
(E'119', E'8', E'1b965638435da6e428c9d3d3316ac77ea3dad74f3427eed61cfd1dcaed5c1856', E'1792666163', E'0', E'1790074163');
|
||||
(E'119', E'8', E'1b965638435da6e428c9d3d3316ac77ea3dad74f3427eed61cfd1dcaed5c1856', E'1792666163', E'0', E'1790074163'),
|
||||
(E'1', E'7', E'a6d40efa41eb7184626615404d62eec90837387fd9c0fab4b2e4998f99116641', E'1790768077', E'1', E'1788176077'),
|
||||
(E'2', E'7', E'294f4f0e9a3933bc0a346a650e9c2229c73351f23073f4826de864c60aae7ab3', E'1790768092', E'1', E'1788176092'),
|
||||
(E'3', E'7', E'1b5cb599d3cb5f34e154e1a30ed531f6bb60899a0f4eb7baa1ece97a2b0b8922', E'1790769528', E'1', E'1788177528'),
|
||||
(E'4', E'7', E'4f53b8a0dcf701a2935e2616ca183e1538fab999fd2d282ec5efb347c130772f', E'1790769528', E'1', E'1788177528');
|
||||
INSERT INTO public."refresh_tokens" ("id", "user_id", "token_hash", "expires_at", "revoked", "created_at") VALUES
|
||||
(E'9', E'7', E'43e9ab9901f7e3a3ca79e581195666c0a298a0cdaaa08655ccdd7b1e8995e68a', E'1790907621', E'1', E'1788315621'),
|
||||
(E'10', E'7', E'ee69982285607bcda68c297be3826cf17aebe16ee5d5eb354846d5f848ce1644', E'1790913746', E'1', E'1788321746'),
|
||||
(E'11', E'7', E'82980a5eb43432b294fe98e0ace622da74e8b60349a8a82be416972d19505017', E'1790913779', E'1', E'1788321779'),
|
||||
(E'12', E'7', E'2a28617d4931e139b76c6bece9ed89544984c14349e758163870dc38289b7279', E'1790923131', E'1', E'1788331131'),
|
||||
(E'13', E'7', E'4736dcf29020280cd3a7824ebbcea35cefa5e019bb6b9f2c9f98a596f4e09057', E'1790923500', E'1', E'1788331500'),
|
||||
(E'14', E'7', E'18627461e72af8e993f801933fd287a46f259f6fddd18dbd98a00730bf744b52', E'1790923558', E'1', E'1788331558'),
|
||||
(E'15', E'7', E'a25ae2038941445a00858015f043d04b9d2a25cfaf22020c30790d0054090b84', E'1790923951', E'1', E'1788331951'),
|
||||
(E'16', E'7', E'b1a72a023fb3ceb71534b5e91b53b98df197a1f807d0644746971075dc0d4135', E'1790923962', E'1', E'1788331962'),
|
||||
(E'17', E'7', E'876f4d75315a134c598aaf8afd5081f88489dc923a8fc5c23be6600c61625910', E'1790923982', E'1', E'1788331982'),
|
||||
(E'18', E'7', E'1f05e0f60671db96c68936b93dbbe3fd3f6444cd4b90867e0a8e8b450d97ea22', E'1790924007', E'1', E'1788332007'),
|
||||
(E'19', E'7', E'd2a0239104b52086cfd2cb6aec5ba64f967b4a4b1f61ce25cc3b32762c734561', E'1790924072', E'1', E'1788332072'),
|
||||
(E'20', E'7', E'fc81e702b009efee38d47f1dea0e9644885b4cbec52dac9e5c60c03f4858fa0e', E'1790924658', E'1', E'1788332658'),
|
||||
(E'21', E'7', E'bd55e380968376e1881fc6df846384c9fce9711290be367a65001c96f044799d', E'1790926919', E'1', E'1788334919'),
|
||||
(E'22', E'7', E'51cef85f469027417dc994e5d977efd1a318dc75ae0804bbfc3e019456248bd6', E'1790927021', E'1', E'1788335021'),
|
||||
(E'24', E'7', E'b180038e3448f8697f983c3ba2efb93acd7037df03fa27574ac9dceeba189f4c', E'1790928286', E'1', E'1788336286'),
|
||||
(E'29', E'7', E'22af98693b2caec27e958713b914414d8cf5f306101d53226c9d04dc6754b671', E'1790930929', E'1', E'1788338929'),
|
||||
(E'34', E'7', E'09bdc1a3388e2b09114339ac5a798b3b060a0d880d4d5a3b9e358a1a976dc703', E'1790934593', E'1', E'1788342593'),
|
||||
(E'35', E'7', E'a3ba322c3161d576afe7b2a3275cca4e215a91ee0768718f9aa841bc219f37bc', E'1790934604', E'1', E'1788342604'),
|
||||
(E'120', E'7', E'c74e517dc0d12b895e5867b241fde55c78b55fc9ee44a72501b8f2035d80528b', E'1792736601', E'0', E'1790144601');
|
||||
|
||||
INSERT INTO public."street_snap_images" ("id", "snap_id", "image", "name", "sort_order", "is_deleted", "created_at", "updated_at", "phash", "is_duplicate", "dup_of", "is_detail", "parent_image_id") VALUES
|
||||
(E'443', E'6', E'street/4928cc08576f7c041facc49a813f08fff0bc51da.jpg', E'Look 1', E'1', E'1', E'1790050749', E'1790075943', E'[1,1,1,0,1,0,1,0,1,1,1,0,1,1,1,0,0,1,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,0,0,0,1,1,0,0,1,0,0,0,0,1,1,0,0,0,0,0,0,1,1,0,0,1,1,0,1,1,0,0]', E'0', E'0', E'0', E'0'),
|
||||
@ -3677,7 +3678,7 @@ INSERT INTO public."street_snaps" ("id", "title", "year", "city", "cover", "imag
|
||||
(E'146', E'London Street Style Spring 2027 Day 2', E'2027', E'London', E'street/a9c1b744df1a9aaf7067d2e88835aead98fb4003.jpg', E'329', E'0', E'1789914056', E'1789914056', E'', E'', E'pending', E'100', E'', E''),
|
||||
(E'147', E'The Best Street Style of Milan Fashion Week Fall 2026', E'2026', E'Milan', E'street/751fbc91e3e5fba3c4ca3420928cc829cbf1ad20.jpg', E'156', E'0', E'1789914679', E'1789914679', E'', E'', E'pending', E'101', E'', E''),
|
||||
(E'148', E'The Best Street Style of London Fashion Week Fall 2026', E'2026', E'London', E'street/1bdd3d1c5256a9601b24373934cad5d60661f301.jpg', E'81', E'0', E'1789915003', E'1789915003', E'', E'', E'pending', E'102', E'', E''),
|
||||
(E'149', E'The Best Street Style From Copenhagen Fashion Week', E'0', E'Copenhagen', E'street/697a793538c53668ff288073b8e361c73578478f.jpg', E'59', E'0', E'1789917788', E'1789917788', E'', E'', E'pending', E'104', E'', E'');
|
||||
(E'149', E'The Best Street Style From Copenhagen Fashion Week', E'0', E'Copenhagen', E'street/697a793538c53668ff288073b8e361c73578478f.jpg', E'59', E'0', E'1789917788', E'1790144662', E'', E'', E'published', E'104', E'admin', E'');
|
||||
|
||||
INSERT INTO public."users" ("id", "created_at", "updated_at", "username", "email", "password_hash", "is_deleted", "tier") VALUES
|
||||
(E'1', E'1785817977', E'1788599843', E'testuser', E'test@example.com', E'$2a$10$osJmeI6QuLTLobycj50zgOd9moBRQ6wzWbTwIHbrpLkmCNE8MQbAu', E'0', E'free'),
|
||||
|
||||
Reference in New Issue
Block a user