File size: 3,807 Bytes
35743bd
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
import { requireManagementAuth } from "@/lib/api/requireManagementAuth";
import { createErrorResponse, createErrorResponseFromUnknown } from "@/lib/api/errorResponse";
import { isValidationFailure, validateBody } from "@/shared/validation/helpers";
import {
  listOneproxyProxies,
  getOneproxyStats,
  deleteOneproxyProxy,
  clearAllOneproxyProxies,
} from "@/lib/localDb";
import {
  syncOneproxyProxies,
  getOneproxySyncStatus,
  resetOneproxyCircuitBreaker,
} from "@/lib/oneproxySync";
import { oneproxyFilterSchema, oneproxySyncSchema } from "@/shared/validation/oneproxySchemas";

export async function GET(request: Request) {
  const authError = await requireManagementAuth(request);
  if (authError) return authError;

  try {
    const { searchParams } = new URL(request.url);
    const action = searchParams.get("action");

    if (action === "stats") {
      const stats = await getOneproxyStats();
      const status = getOneproxySyncStatus();
      return Response.json({ stats, status });
    }

    if (action === "status") {
      return Response.json(getOneproxySyncStatus());
    }

    const filterValidation = validateBody(oneproxyFilterSchema, {
      protocol: searchParams.get("protocol") || undefined,
      countryCode: searchParams.get("countryCode") || undefined,
      minQuality: searchParams.get("minQuality") || undefined,
      limit: searchParams.get("limit") || undefined,
    });

    if (isValidationFailure(filterValidation)) {
      return createErrorResponse({
        status: 400,
        message: filterValidation.error.message,
        type: "invalid_request",
      });
    }

    const proxies = await listOneproxyProxies({
      protocol: filterValidation.data.protocol,
      countryCode: filterValidation.data.countryCode,
      minQuality: filterValidation.data.minQuality,
      limit: filterValidation.data.limit,
    });

    return Response.json({ items: proxies, total: proxies.length });
  } catch (error) {
    return createErrorResponseFromUnknown(error, "Failed to load 1proxy proxies");
  }
}

export async function POST(request: Request) {
  const authError = await requireManagementAuth(request);
  if (authError) return authError;

  let rawBody: unknown;
  try {
    rawBody = await request.json();
  } catch {
    return createErrorResponse({
      status: 400,
      message: "Invalid JSON body",
      type: "invalid_request",
    });
  }

  try {
    const validation = validateBody(oneproxySyncSchema, rawBody);
    if (isValidationFailure(validation)) {
      return createErrorResponse({
        status: 400,
        message: validation.error.message,
        type: "invalid_request",
      });
    }

    const result = await syncOneproxyProxies();
    return Response.json(result);
  } catch (error) {
    return createErrorResponseFromUnknown(error, "Failed to sync 1proxy proxies");
  }
}

export async function DELETE(request: Request) {
  const authError = await requireManagementAuth(request);
  if (authError) return authError;

  try {
    const { searchParams } = new URL(request.url);
    const id = searchParams.get("id");
    const clearAll = searchParams.get("clearAll") === "1";

    if (clearAll) {
      const count = await clearAllOneproxyProxies();
      return Response.json({ success: true, deleted: count });
    }

    if (!id) {
      return createErrorResponse({
        status: 400,
        message: "id or clearAll is required",
        type: "invalid_request",
      });
    }

    const deleted = await deleteOneproxyProxy(id);
    if (!deleted) {
      return createErrorResponse({ status: 404, message: "Proxy not found", type: "not_found" });
    }

    return Response.json({ success: true });
  } catch (error) {
    return createErrorResponseFromUnknown(error, "Failed to delete 1proxy proxy");
  }
}