Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: add database filesize in UI #488

Merged
merged 1 commit into from
Nov 18, 2022
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions api/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,8 @@ import "github.com/usememos/memos/server/profile"
type SystemStatus struct {
Host *User `json:"host"`
Profile *profile.Profile `json:"profile"`
DBSize int64 `json:"dbSize"`

// System settings
// Allow sign up.
AllowSignUp bool `json:"allowSignUp"`
Expand Down
11 changes: 9 additions & 2 deletions server/resource.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,11 @@ import (
"github.com/labstack/echo/v4"
)

const (
// The max file size is 32MB.
maxFileSize = (32 * 8) << 20
)

func (s *Server) registerResourceRoutes(g *echo.Group) {
g.POST("/resource", func(c echo.Context) error {
ctx := c.Request().Context()
Expand All @@ -24,13 +29,15 @@ func (s *Server) registerResourceRoutes(g *echo.Group) {
return echo.NewHTTPError(http.StatusUnauthorized, "Missing user in session")
}

err := c.Request().ParseMultipartForm(64 << 20)
if err != nil {
if err := c.Request().ParseMultipartForm(maxFileSize); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, "Upload file overload max size").SetInternal(err)
}

file, err := c.FormFile("file")
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to get uploading file").SetInternal(err)
}
if file == nil {
return echo.NewHTTPError(http.StatusBadRequest, "Upload file not found").SetInternal(err)
}

Expand Down
12 changes: 12 additions & 0 deletions server/system.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,9 +3,11 @@ package server
import (
"encoding/json"
"net/http"
"os"

"github.com/usememos/memos/api"
"github.com/usememos/memos/common"
metric "github.com/usememos/memos/plugin/metrics"

"github.com/labstack/echo/v4"
)
Expand Down Expand Up @@ -65,6 +67,12 @@ func (s *Server) registerSystemRoutes(g *echo.Group) {
}
}

fi, err := os.Stat(s.Profile.DSN)
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to read database fileinfo").SetInternal(err)
}
systemStatus.DBSize = fi.Size()

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemStatus)); err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to encode system status response").SetInternal(err)
Expand Down Expand Up @@ -103,6 +111,10 @@ func (s *Server) registerSystemRoutes(g *echo.Group) {
if err != nil {
return echo.NewHTTPError(http.StatusInternalServerError, "Failed to upsert system setting").SetInternal(err)
}
s.Collector.Collect(ctx, &metric.Metric{
Name: "systemSetting updated",
Labels: map[string]string{"field": string(systemSettingUpsert.Name)},
})

c.Response().Header().Set(echo.HeaderContentType, echo.MIMEApplicationJSONCharsetUTF8)
if err := json.NewEncoder(c.Response().Writer).Encode(composeResponse(systemSetting)); err != nil {
Expand Down
4 changes: 2 additions & 2 deletions server/version/version.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,10 +7,10 @@ import (

// Version is the service current released version.
// Semantic versioning: https://semver.org/
var Version = "0.7.2"
var Version = "0.7.3"

// DevVersion is the service current development version.
var DevVersion = "0.7.2"
var DevVersion = "0.7.3"

func GetCurrentVersion(mode string) string {
if mode == "dev" {
Expand Down
1 change: 1 addition & 0 deletions web/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,7 @@ function App() {
globalService.initialState();
}, []);

// Inject additional style and script codes.
useEffect(() => {
api.getSystemStatus().then(({ data }) => {
const { data: status } = data;
Expand Down
32 changes: 25 additions & 7 deletions web/src/components/Settings/SystemSection.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,28 @@ import { useTranslation } from "react-i18next";
import { Button, Switch, Textarea } from "@mui/joy";
import * as api from "../../helpers/api";
import toastHelper from "../Toast";
import "../../less/settings/preferences-section.less";
import "../../less/settings/system-section.less";

interface State {
dbSize: number;
allowSignUp: boolean;
additionalStyle: string;
additionalScript: string;
}

const formatBytes = (bytes: number) => {
if (bytes <= 0) return "0 Bytes";
const k = 1024,
dm = 2,
sizes = ["Bytes", "KB", "MB", "GB", "TB", "PB", "EB", "ZB", "YB"],
i = Math.floor(Math.log(bytes) / Math.log(k));
return parseFloat((bytes / Math.pow(k, i)).toFixed(dm)) + sizes[i];
};

const SystemSection = () => {
const { t } = useTranslation();
const [state, setState] = useState<State>({
dbSize: 0,
allowSignUp: false,
additionalStyle: "",
additionalScript: "",
Expand All @@ -23,6 +34,7 @@ const SystemSection = () => {
api.getSystemStatus().then(({ data }) => {
const { data: status } = data;
setState({
dbSize: status.dbSize,
allowSignUp: status.allowSignUp,
additionalStyle: status.additionalStyle,
additionalScript: status.additionalScript,
Expand Down Expand Up @@ -82,13 +94,17 @@ const SystemSection = () => {
};

return (
<div className="section-container preferences-section-container">
<div className="section-container system-section-container">
<p className="title-text">{t("common.basic")}</p>
<label className="form-label selector">
<p className="text-value">
Database File Size: <span className="font-mono font-medium">{formatBytes(state.dbSize)}</span>
</p>
<p className="title-text">{t("sidebar.setting")}</p>
<label className="form-label">
<span className="normal-text">Allow user signup</span>
<Switch size="sm" checked={state.allowSignUp} onChange={(event) => handleAllowSignUpChanged(event.target.checked)} />
</label>
<div className="form-label selector">
<div className="form-label">
<span className="normal-text">Additional style</span>
<Button size="sm" onClick={handleSaveAdditionalStyle}>
Save
Expand All @@ -100,12 +116,13 @@ const SystemSection = () => {
fontFamily: "monospace",
fontSize: "14px",
}}
minRows={5}
minRows={4}
maxRows={10}
placeholder="Additional css codes"
value={state.additionalStyle}
onChange={(event) => handleAdditionalStyleChanged(event.target.value)}
/>
<div className="form-label selector mt-2">
<div className="form-label mt-2">
<span className="normal-text">Additional script</span>
<Button size="sm" onClick={handleSaveAdditionalScript}>
Save
Expand All @@ -117,8 +134,9 @@ const SystemSection = () => {
fontFamily: "monospace",
fontSize: "14px",
}}
minRows={5}
minRows={4}
maxRows={10}
placeholder="Additional JavaScript codes"
value={state.additionalScript}
onChange={(event) => handleAdditionalScriptChanged(event.target.value)}
/>
Expand Down
1 change: 0 additions & 1 deletion web/src/components/ShareMemoImageDialog.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,7 +64,6 @@ const ShareMemoImageDialog: React.FC<Props> = (props: Props) => {
}

toImage(memoElRef.current, {
backgroundColor: "#eaeaea",
pixelRatio: window.devicePixelRatio * 2,
})
.then((url) => {
Expand Down
9 changes: 0 additions & 9 deletions web/src/helpers/storage.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,12 +57,3 @@ export function remove(keys: StorageKey[]) {
}
}
}

export function emitStorageChangedEvent() {
const iframeEl = document.createElement("iframe");
iframeEl.style.display = "none";
document.body.appendChild(iframeEl);

iframeEl.contentWindow?.localStorage.setItem("t", Date.now().toString());
iframeEl.remove();
}
2 changes: 1 addition & 1 deletion web/src/less/base-dialog.less
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
.dialog-wrapper {
@apply fixed top-0 left-0 flex flex-col justify-start items-center w-full h-full pt-16 z-100 overflow-x-hidden overflow-y-scroll bg-transparent transition-all hide-scrollbar;
@apply fixed top-0 left-0 flex flex-col justify-start items-center w-full h-full pt-16 pb-8 z-100 overflow-x-hidden overflow-y-scroll bg-transparent transition-all hide-scrollbar;

&.showup {
background-color: rgba(0, 0, 0, 0.6);
Expand Down
17 changes: 17 additions & 0 deletions web/src/less/settings/system-section.less
Original file line number Diff line number Diff line change
@@ -0,0 +1,17 @@
.system-section-container {
> .title-text {
@apply mt-4 first:mt-1;
}

> .text-value {
@apply mr-2 text-sm;
}

> .form-label {
@apply mb-2 flex flex-row justify-between items-center;

> .normal-text {
@apply mr-2 text-sm;
}
}
}
6 changes: 3 additions & 3 deletions web/src/less/share-memo-image-dialog.less
Original file line number Diff line number Diff line change
Expand Up @@ -42,7 +42,7 @@
}

> .time-text {
@apply w-full px-6 pt-5 pb-2 text-xs text-gray-500 bg-white;
@apply w-full px-6 pt-5 pb-2 text-sm text-gray-500 bg-white;
}

> .memo-content-wrapper {
Expand Down Expand Up @@ -72,11 +72,11 @@
@apply w-64 flex flex-col justify-center items-start;

> .name-text {
@apply text-lg truncate font-bold text-gray-600;
@apply text-lg truncate font-medium text-gray-600;
}

> .usage-text {
@apply -mt-1 text-sm text-gray-400 font-medium;
@apply -mt-1 text-sm font-normal text-gray-400;
}
}

Expand Down
2 changes: 1 addition & 1 deletion web/src/locales/en.json
Original file line number Diff line number Diff line change
Expand Up @@ -79,7 +79,7 @@
},
"editor": {
"editing": "Editing...",
"cancel-edit": "Cancel Edit",
"cancel-edit": "Cancel edit",
"save": "Save",
"placeholder": "Any thoughts...",
"only-image-supported": "Only image file supported.",
Expand Down
1 change: 1 addition & 0 deletions web/src/types/modules/system.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ interface Profile {
interface SystemStatus {
host: User;
profile: Profile;
dbSize: number;
// System settings
allowSignUp: boolean;
additionalStyle: string;
Expand Down