Procházet zdrojové kódy

feat: revoke action, edit button for all statuses in my places

neyrogovnarik před 1 měsícem
rodič
revize
f88d8195cd

+ 1 - 1
backend/internal/handlers/places.go

@@ -192,7 +192,7 @@ type updatePlaceRequest struct {
 }
 
 type moderatePlaceRequest struct {
-	Action  string  `json:"action" validate:"required,oneof=approve reject rework"`
+	Action  string  `json:"action" validate:"required,oneof=approve reject rework revoke"`
 	Comment *string `json:"comment" validate:"omitempty,max=1000"`
 }
 

+ 2 - 0
backend/internal/services/places.go

@@ -244,6 +244,8 @@ func (s *PlaceService) Moderate(ctx context.Context, id, action, comment, modera
 		status = "rejected"
 	case "rework":
 		status = "revision"
+	case "revoke":
+		status = "pending_moderation"
 	default:
 		return fmt.Errorf("unknown action: %s", action)
 	}

+ 8 - 2
frontend/src/app/admin/page.tsx

@@ -37,14 +37,15 @@ export default function AdminModerationPage() {
 
   useEffect(() => { fetchPlaces() }, [fetchPlaces])
 
-  const moderate = async (id: string, action: 'approve' | 'reject' | 'rework') => {
+  const moderate = async (id: string, action: 'approve' | 'reject' | 'rework' | 'revoke') => {
     const comment = action === 'rework' ? reworkComment : ''
     try {
       await api.post(`/places/${id}/moderate`, { action, comment })
       setPlaces((prev) => prev.filter((p) => p.id !== id))
       setActionMsg(
         action === 'approve' ? 'Одобрено' :
-        action === 'reject' ? 'Отклонено' : 'Отправлено на доработку'
+        action === 'reject' ? 'Отклонено' :
+        action === 'revoke' ? 'Отозвано' : 'Отправлено на доработку'
       )
       setReworkId(null)
       setReworkComment('')
@@ -128,6 +129,11 @@ export default function AdminModerationPage() {
                     >Отклонить</button>
                   </>
                 )}
+                {filter === 'published' && (
+                  <button onClick={() => moderate(place.id, 'revoke')}
+                    className="rounded-lg bg-orange-600/80 px-4 py-2 text-sm text-white hover:bg-orange-500 transition"
+                  >Отозвать</button>
+                )}
               </div>
             </div>
           ))}

+ 6 - 8
frontend/src/app/places/my/page.tsx

@@ -61,14 +61,12 @@ export default function MyPlacesPage() {
                     </p>
                   )}
 
-                  {place.status === 'revision' && (
-                    <Link
-                      href={`/places/edit/${place.id}`}
-                      className="mt-3 inline-block rounded-lg bg-yellow-600 px-4 py-1.5 text-sm text-white hover:bg-yellow-500 transition"
-                    >
-                      Редактировать
-                    </Link>
-                  )}
+                  <Link
+                    href={`/places/edit/${place.id}`}
+                    className="mt-3 inline-block rounded-lg bg-white/10 px-4 py-1.5 text-sm text-white hover:bg-white/20 transition"
+                  >
+                    Редактировать
+                  </Link>
                 </div>
               )
             })}