Final phase of #26 — closes out the marketplace feature. Four chunks on top of the phase 1 + 2 foundation.
Trade feedback (gated on Mark-Sold + named buyer)
- Sellers name the buyer at Mark sold time (text input on the show-page action row). That unlocks the feedback form for both sides — one rating each (+1 / 0 / −1) plus an optional 1,000-char comment.
- Stops drive-by negative reviews: only the two parties on a transaction can leave feedback on that transaction.
- One row per (listing, from_user) — enforced by the existing unique key; you can't re-rate the same deal.
- Public reputation stream at /market/user/<username>/feedback — aggregate tiles (+/0/−) plus the table of every feedback row, each linking to the source listing.
- Seller's rolling rep renders as a badge on every listing's right sidebar, so browsers can gauge rep without extra clicks.
- Trade Feedback button added to the profile-actions row next to Tip.
Admin moderation queue (/admin/marketplace)
- Three sections on one page: flagged listings, recent 25, active marketplace bans.
- Flag + Remove + Clear flag on every listing, each requiring an internal moderator note.
- Remove hides the listing from everyone except the seller + admins (same logic as shadow-banned posts); seller gets a notification explaining why.
- Ban from marketplace form: username + duration (0 = permanent) + reason. Permanent encoded as 2099-12-31 so a single column handles none / timed / permanent without an extra flag.
MarketplaceController::store+postReplyboth gate on the ban; site-wide access is unaffected. - Admin-sidebar "Marketplace" link added under Content.
Expanded filter rail on /market
- Condition dropdown.
- Price min / price max (decimal → cents).
- Ships vs. local-pickup availability.
- Location substring match against city / state / country / ships_to.
- All compose with the existing type / platform / category / search.
Re-list button for expired / withdrawn listings
- Seller of an expired or withdrawn listing sees a Re-list button on the show page.
- Flips
status='active'and resetsexpires_atto +30 days. Gated on marketplace-ban, audit-logged.
Minor: a stray test photo from development leaked into the phase 3 commit; fixed immediately after with a .gitignore entry for public/uploads/marketplace/* (same pattern as avatars / forum icons / branding). User photos are runtime data and don't belong in source.
Marketplace is now feature-complete relative to the original #26 spec. Future polish will come from usage.
. __ ____ ___ ____ _ _
/ /_| ___| / _ \___ \(_)___| |__
| '_ \___ \| | | |__) | / __| '_ \
| (_) |__) | |_| / __/| \__ \ | | |
\___/____/ \___/_____|_|___/_| |_|
D2sk - Sysop