From 00bc3406c7e938919992ff00de7975dbbf4abbab Mon Sep 17 00:00:00 2001 From: sunface Date: Wed, 28 Apr 2021 16:41:05 +0800 Subject: [PATCH] update --- pages/[username]/[post_id].tsx | 18 ++++++++++-- server/internal/admin/report.go | 28 ++++++++++++++++++ server/internal/api/admin.go | 21 ++++++++++++++ server/internal/server.go | 1 + server/internal/storage/sql_tables.go | 10 +++++++ src/components/report.tsx | 41 +++++++++++++++++++++++++++ 6 files changed, 116 insertions(+), 3 deletions(-) create mode 100644 server/internal/admin/report.go create mode 100644 src/components/report.tsx diff --git a/pages/[username]/[post_id].tsx b/pages/[username]/[post_id].tsx index 58ec9d52..cdffe569 100644 --- a/pages/[username]/[post_id].tsx +++ b/pages/[username]/[post_id].tsx @@ -1,4 +1,4 @@ -import { Box, Divider, Heading, HStack, Image} from "@chakra-ui/react" +import { Box, Button, chakra, Divider, Flex, Heading, HStack, Image, Radio, RadioGroup, Stack, Text} from "@chakra-ui/react" import Comments from "components/comments/comments" import { MarkdownRender } from "components/markdown-editor/render" import { StoryAuthor } from "components/story/story-author" @@ -14,12 +14,17 @@ import { requestApi } from "utils/axios/request" import StorySidebar from "components/story/story-sidebar" import Series from "components/story/series" import Card from "components/card" +import { FaFlag, FaRegFlag } from "react-icons/fa" +import Head from "next/head" +import { getSvgIcon } from "components/svg-icon" +import Report from "components/report" const PostPage = () => { const router = useRouter() const id = router.query.post_id const [post, setPost]: [Story, any] = useState(null) const [series,setSeries] = useState([]) + const [report,setReport] = useState(false) useEffect(() => { if (id) { getData() @@ -45,7 +50,7 @@ const PostPage = () => { const res = await requestApi.get(`/story/series/byPostID/${id}`) setSeries(res.data) } - + return ( <> { {post.title} - + setReport(true)}> + + + + Report + + + {report && setReport(false)}/>} {post.rawTags.map(tag => )} diff --git a/server/internal/admin/report.go b/server/internal/admin/report.go new file mode 100644 index 00000000..e1a50948 --- /dev/null +++ b/server/internal/admin/report.go @@ -0,0 +1,28 @@ +package admin + +import ( + "net/http" + "time" + + "github.com/grafana/grafana/pkg/cmd/grafana-cli/logger" + "github.com/imdotdev/im.dev/server/pkg/db" + "github.com/imdotdev/im.dev/server/pkg/e" + "github.com/imdotdev/im.dev/server/pkg/models" +) + +const ( + StatusUndealed = 1 + StatusDealed = 2 +) + +func AddReport(targetID string, content string, reporter string) *e.Error { + _, err := db.Conn.Exec("INSERT INTO report (target_id,type,reporter,status,created) VALUES (?,?,?,?,?)", + targetID, models.GetIDType(targetID), reporter, StatusUndealed, time.Now()) + + if err != nil { + logger.Warn("add report error", "error", err) + return e.New(http.StatusInternalServerError, e.Internal) + } + + return nil +} diff --git a/server/internal/api/admin.go b/server/internal/api/admin.go index b7062c0f..54cca579 100644 --- a/server/internal/api/admin.go +++ b/server/internal/api/admin.go @@ -2,6 +2,7 @@ package api import ( "encoding/json" + "fmt" "net/http" "github.com/asaskevich/govalidator" @@ -67,3 +68,23 @@ func AdminConfig(c *gin.Context) { json.Unmarshal(data, &m) c.JSON(http.StatusOK, common.RespSuccess(m)) } + +type ReportReq struct { + TargetID string `json:"targetID"` + Content string `json:"content"` +} + +func SubmitReport(c *gin.Context) { + req := &ReportReq{} + c.Bind(&req) + fmt.Println(*req) + + u := user.CurrentUser(c) + err := admin.AddReport(req.TargetID, req.Content, u.ID) + if err != nil { + c.JSON(err.Status, common.RespError(err.Message)) + return + } + + c.JSON(http.StatusOK, common.RespSuccess(nil)) +} diff --git a/server/internal/server.go b/server/internal/server.go index f08b1dd3..d9b8a09d 100644 --- a/server/internal/server.go +++ b/server/internal/server.go @@ -165,6 +165,7 @@ func (s *Server) Start() error { r.GET("/sidebars", GetSidebars) r.POST("/sidebar", IsLogin(), SubmitSidebar) + r.POST("/report", IsLogin(), api.SubmitReport) err := router.Run(config.Data.Server.Addr) if err != nil { logger.Crit("start backend server error", "error", err) diff --git a/server/internal/storage/sql_tables.go b/server/internal/storage/sql_tables.go index b6bf829d..dcd23cd1 100644 --- a/server/internal/storage/sql_tables.go +++ b/server/internal/storage/sql_tables.go @@ -286,4 +286,14 @@ var sqlTables = map[string]string{ mail VARCHAR(255), created DATETIME );`, + "report": `CREATE TABLE IF NOT EXISTS report ( + target_id VARCHAR(255), + type VARCHAR(1) NOT NULL, + reporter VARCHAR(255) NOT NULL, + status tinyint NOT NULL, + created DATETIME NOT NULL + ); + CREATE UNIQUE INDEX IF NOT EXISTS report_target_reporter + ON report (target_id,reporter); + `, } diff --git a/src/components/report.tsx b/src/components/report.tsx new file mode 100644 index 00000000..cd5c4f2c --- /dev/null +++ b/src/components/report.tsx @@ -0,0 +1,41 @@ +import React, { useState } from "react" +import { Box, Button, chakra, Flex, Heading, Radio, RadioGroup, Stack } from "@chakra-ui/react" +import { getSvgIcon } from "./svg-icon"; +import { requestApi } from "utils/axios/request"; + +interface Props { + targetID: string + onClose: any +} + +export const Report = (props: Props) => { + const [reportValue, setReportValue] = useState("It's spam") + + const submit = async () => { + await requestApi.post(`/report`,{targetID: props.targetID, content: reportValue}) + props.onClose() + } + + return ( + + + Help us understand the problem. What is going on with this post? + {getSvgIcon("close")} + + + + It's spam + It's abusive + I am not interested + This should not be on Hashnode + + + + + ) +} + +export default Report