Path: blob/master/web/v2/api/handlers/scanners.go
994 views
package handlers12import (3"github.com/gin-gonic/gin"4"github.com/sundowndev/phoneinfoga/v2/lib/number"5"github.com/sundowndev/phoneinfoga/v2/lib/remote"6"github.com/sundowndev/phoneinfoga/v2/web/v2/api"7"net/http"8)910type Scanner struct {11Name string `json:"name"`12Description string `json:"description"`13}1415type GetAllScannersResponse struct {16Scanners []Scanner `json:"scanners"`17}1819// GetAllScanners is an HTTP handler20// @ID GetAllScanners21// @Tags Numbers22// @Summary Get all available scanners.23// @Description This route returns all available scanners.24// @Produce json25// @Success 200 {object} GetAllScannersResponse26// @Router /v2/scanners [get]27func GetAllScanners(*gin.Context) *api.Response {28var scanners []Scanner29for _, s := range RemoteLibrary.GetAllScanners() {30scanners = append(scanners, Scanner{31Name: s.Name(),32Description: s.Description(),33})34}3536return &api.Response{37Code: http.StatusOK,38JSON: true,39Data: GetAllScannersResponse{40Scanners: scanners,41},42}43}4445type DryRunScannerInput struct {46Number string `json:"number" binding:"number,required"`47Options remote.ScannerOptions `json:"options" validate:"dive,required"`48}4950type DryRunScannerResponse struct {51Success bool `json:"success"`52Error string `json:"error,omitempty"`53}5455// DryRunScanner is an HTTP handler56// @ID DryRunScanner57// @Tags Numbers58// @Summary Dry run a single scanner59// @Description This route performs a dry run with the given phone number. This doesn't perform an actual scan.60// @Accept json61// @Produce json62// @Param request body DryRunScannerInput true "Request body"63// @Success 200 {object} DryRunScannerResponse64// @Success 404 {object} api.ErrorResponse65// @Success 500 {object} api.ErrorResponse66// @Router /v2/scanners/{scanner}/dryrun [post]67// @Param scanner path string true "Scanner name" validate(required)68func DryRunScanner(ctx *gin.Context) *api.Response {69var input DryRunScannerInput70if err := ctx.ShouldBindJSON(&input); err != nil {71return &api.Response{72Code: http.StatusBadRequest,73JSON: true,74Data: api.ErrorResponse{Error: "Invalid phone number: please provide an integer without any special chars"},75}76}7778if input.Options == nil {79input.Options = make(remote.ScannerOptions)80}8182scanner := RemoteLibrary.GetScanner(ctx.Param("scanner"))83if scanner == nil {84return &api.Response{85Code: http.StatusNotFound,86JSON: true,87Data: api.ErrorResponse{Error: "Scanner not found"},88}89}9091num, err := number.NewNumber(input.Number)92if err != nil {93return &api.Response{94Code: http.StatusBadRequest,95JSON: true,96Data: api.ErrorResponse{Error: err.Error()},97}98}99100err = scanner.DryRun(*num, input.Options)101if err != nil {102return &api.Response{103Code: http.StatusBadRequest,104JSON: true,105Data: DryRunScannerResponse{106Success: false,107Error: err.Error(),108},109}110}111112return &api.Response{113Code: http.StatusOK,114JSON: true,115Data: DryRunScannerResponse{116Success: true,117},118}119}120121type RunScannerInput struct {122Number string `json:"number" binding:"number,required"`123Options remote.ScannerOptions `json:"options" validate:"dive,required"`124}125126type RunScannerResponse struct {127Result interface{} `json:"result"`128}129130// RunScanner is an HTTP handler131// @ID RunScanner132// @Tags Numbers133// @Summary Run a single scanner134// @Description This route runs a single scanner with the given phone number135// @Accept json136// @Produce json137// @Param request body RunScannerInput true "Request body"138// @Success 200 {object} RunScannerResponse139// @Success 404 {object} api.ErrorResponse140// @Success 500 {object} api.ErrorResponse141// @Router /v2/scanners/{scanner}/run [post]142// @Param scanner path string true "Scanner name" validate(required)143func RunScanner(ctx *gin.Context) *api.Response {144var input RunScannerInput145if err := ctx.ShouldBindJSON(&input); err != nil {146return &api.Response{147Code: http.StatusBadRequest,148JSON: true,149Data: api.ErrorResponse{Error: "Invalid phone number: please provide an integer without any special chars"},150}151}152153if input.Options == nil {154input.Options = make(remote.ScannerOptions)155}156157scanner := RemoteLibrary.GetScanner(ctx.Param("scanner"))158if scanner == nil {159return &api.Response{160Code: http.StatusNotFound,161JSON: true,162Data: api.ErrorResponse{Error: "Scanner not found"},163}164}165166num, err := number.NewNumber(input.Number)167if err != nil {168return &api.Response{169Code: http.StatusBadRequest,170JSON: true,171Data: api.ErrorResponse{Error: err.Error()},172}173}174175result, err := scanner.Run(*num, input.Options)176if err != nil {177return &api.Response{178Code: http.StatusInternalServerError,179JSON: true,180Data: api.ErrorResponse{Error: err.Error()},181}182}183184return &api.Response{185Code: http.StatusOK,186JSON: true,187Data: RunScannerResponse{188Result: result,189},190}191}192193194