mirror of
https://github.com/sasjs/server.git
synced 2025-12-10 19:34:34 +00:00
Compare commits
10 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
abe942e697 | ||
|
|
faf2edb111 | ||
| 5bec453e89 | |||
| 7f2174dd2c | |||
| 2bae52e307 | |||
|
|
b243e62ece | ||
|
|
88c3056e97 | ||
| 203303b659 | |||
| 835709bd36 | |||
| 69f2576ee6 |
14
CHANGELOG.md
14
CHANGELOG.md
@@ -1,3 +1,17 @@
|
|||||||
|
## [0.28.7](https://github.com/sasjs/server/compare/v0.28.6...v0.28.7) (2023-02-03)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* add user to all users group on user creation ([2bae52e](https://github.com/sasjs/server/commit/2bae52e307327d7ee4a94b19d843abdc0ccec9d1))
|
||||||
|
|
||||||
|
## [0.28.6](https://github.com/sasjs/server/compare/v0.28.5...v0.28.6) (2023-01-26)
|
||||||
|
|
||||||
|
|
||||||
|
### Bug Fixes
|
||||||
|
|
||||||
|
* show loading spinner on login screen while request is in process ([69f2576](https://github.com/sasjs/server/commit/69f2576ee6d3d7b7f3325922a88656d511e3ac88))
|
||||||
|
|
||||||
## [0.28.5](https://github.com/sasjs/server/compare/v0.28.4...v0.28.5) (2023-01-01)
|
## [0.28.5](https://github.com/sasjs/server/compare/v0.28.4...v0.28.5) (2023-01-01)
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
2499
api/package-lock.json
generated
2499
api/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -92,7 +92,7 @@
|
|||||||
"dotenv": "^10.0.0",
|
"dotenv": "^10.0.0",
|
||||||
"http-headers-validation": "^0.0.1",
|
"http-headers-validation": "^0.0.1",
|
||||||
"jest": "^27.0.6",
|
"jest": "^27.0.6",
|
||||||
"mongodb-memory-server": "^8.0.0",
|
"mongodb-memory-server": "8.11.4",
|
||||||
"nodejs-file-downloader": "4.10.2",
|
"nodejs-file-downloader": "4.10.2",
|
||||||
"nodemon": "^2.0.7",
|
"nodemon": "^2.0.7",
|
||||||
"pkg": "5.6.0",
|
"pkg": "5.6.0",
|
||||||
|
|||||||
@@ -159,7 +159,7 @@ const updatePassword = async (
|
|||||||
) => {
|
) => {
|
||||||
const { currentPassword, newPassword } = data
|
const { currentPassword, newPassword } = data
|
||||||
const userId = req.user?.userId
|
const userId = req.user?.userId
|
||||||
const dbUser = await User.findOne({ userId })
|
const dbUser = await User.findOne({ id: userId })
|
||||||
|
|
||||||
if (!dbUser)
|
if (!dbUser)
|
||||||
throw {
|
throw {
|
||||||
|
|||||||
@@ -21,9 +21,9 @@ import {
|
|||||||
getUserAutoExec,
|
getUserAutoExec,
|
||||||
updateUserAutoExec,
|
updateUserAutoExec,
|
||||||
ModeType,
|
ModeType,
|
||||||
AuthProviderType
|
ALL_USERS_GROUP
|
||||||
} from '../utils'
|
} from '../utils'
|
||||||
import { GroupResponse } from './group'
|
import { GroupController, GroupResponse } from './group'
|
||||||
|
|
||||||
export interface UserResponse {
|
export interface UserResponse {
|
||||||
id: number
|
id: number
|
||||||
@@ -237,6 +237,15 @@ const createUser = async (data: UserPayload): Promise<UserDetailsResponse> => {
|
|||||||
|
|
||||||
const savedUser = await user.save()
|
const savedUser = await user.save()
|
||||||
|
|
||||||
|
const groupController = new GroupController()
|
||||||
|
const allUsersGroup = await groupController
|
||||||
|
.getGroupByGroupName(ALL_USERS_GROUP.name)
|
||||||
|
.catch(() => {})
|
||||||
|
|
||||||
|
if (allUsersGroup) {
|
||||||
|
await groupController.addUserToGroup(allUsersGroup.groupId, savedUser.id)
|
||||||
|
}
|
||||||
|
|
||||||
return {
|
return {
|
||||||
id: savedUser.id,
|
id: savedUser.id,
|
||||||
displayName: savedUser.displayName,
|
displayName: savedUser.displayName,
|
||||||
|
|||||||
@@ -23,12 +23,12 @@ export const seedDB = async (): Promise<ConfigurationType> => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Checking if 'AllUsers' Group is already in the database
|
// Checking if 'AllUsers' Group is already in the database
|
||||||
let groupExist = await Group.findOne({ name: GROUP.name })
|
let groupExist = await Group.findOne({ name: ALL_USERS_GROUP.name })
|
||||||
if (!groupExist) {
|
if (!groupExist) {
|
||||||
const group = new Group(GROUP)
|
const group = new Group(ALL_USERS_GROUP)
|
||||||
groupExist = await group.save()
|
groupExist = await group.save()
|
||||||
|
|
||||||
process.logger.success(`DB Seed - Group created: ${GROUP.name}`)
|
process.logger.success(`DB Seed - Group created: ${ALL_USERS_GROUP.name}`)
|
||||||
}
|
}
|
||||||
|
|
||||||
// Checking if 'Public' Group is already in the database
|
// Checking if 'Public' Group is already in the database
|
||||||
@@ -54,7 +54,7 @@ export const seedDB = async (): Promise<ConfigurationType> => {
|
|||||||
if (!groupExist.hasUser(usernameExist)) {
|
if (!groupExist.hasUser(usernameExist)) {
|
||||||
groupExist.addUser(usernameExist)
|
groupExist.addUser(usernameExist)
|
||||||
process.logger.success(
|
process.logger.success(
|
||||||
`DB Seed - admin account '${ADMIN_USER.username}' added to Group '${GROUP.name}'`
|
`DB Seed - admin account '${ADMIN_USER.username}' added to Group '${ALL_USERS_GROUP.name}'`
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -75,7 +75,7 @@ export const seedDB = async (): Promise<ConfigurationType> => {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const GROUP = {
|
export const ALL_USERS_GROUP = {
|
||||||
name: 'AllUsers',
|
name: 'AllUsers',
|
||||||
description: 'Group contains all users'
|
description: 'Group contains all users'
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,7 +2,14 @@ import axios from 'axios'
|
|||||||
import React, { useState, useContext } from 'react'
|
import React, { useState, useContext } from 'react'
|
||||||
import PropTypes from 'prop-types'
|
import PropTypes from 'prop-types'
|
||||||
|
|
||||||
import { CssBaseline, Box, TextField, Button } from '@mui/material'
|
import {
|
||||||
|
Backdrop,
|
||||||
|
CircularProgress,
|
||||||
|
CssBaseline,
|
||||||
|
Box,
|
||||||
|
TextField,
|
||||||
|
Button
|
||||||
|
} from '@mui/material'
|
||||||
import { AppContext } from '../context/appContext'
|
import { AppContext } from '../context/appContext'
|
||||||
|
|
||||||
const login = async (payload: { username: string; password: string }) =>
|
const login = async (payload: { username: string; password: string }) =>
|
||||||
@@ -10,21 +17,27 @@ const login = async (payload: { username: string; password: string }) =>
|
|||||||
|
|
||||||
const Login = () => {
|
const Login = () => {
|
||||||
const appContext = useContext(AppContext)
|
const appContext = useContext(AppContext)
|
||||||
|
const [isLoading, setIsLoading] = useState(false)
|
||||||
const [username, setUsername] = useState('')
|
const [username, setUsername] = useState('')
|
||||||
const [password, setPassword] = useState('')
|
const [password, setPassword] = useState('')
|
||||||
const [errorMessage, setErrorMessage] = useState('')
|
const [errorMessage, setErrorMessage] = useState('')
|
||||||
|
|
||||||
const handleSubmit = async (e: any) => {
|
const handleSubmit = async (e: any) => {
|
||||||
|
setIsLoading(true)
|
||||||
setErrorMessage('')
|
setErrorMessage('')
|
||||||
e.preventDefault()
|
e.preventDefault()
|
||||||
|
|
||||||
const { loggedIn, user } = await login({
|
const { loggedIn, user } = await login({
|
||||||
username,
|
username,
|
||||||
password
|
password
|
||||||
}).catch((err: any) => {
|
|
||||||
setErrorMessage(err.response?.data || err.toString())
|
|
||||||
return {}
|
|
||||||
})
|
})
|
||||||
|
.catch((err: any) => {
|
||||||
|
setErrorMessage(err.response?.data || err.toString())
|
||||||
|
return {}
|
||||||
|
})
|
||||||
|
.finally(() => {
|
||||||
|
setIsLoading(false)
|
||||||
|
})
|
||||||
|
|
||||||
if (loggedIn) {
|
if (loggedIn) {
|
||||||
appContext.setUserId?.(user.id)
|
appContext.setUserId?.(user.id)
|
||||||
@@ -37,42 +50,51 @@ const Login = () => {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Box
|
<>
|
||||||
className="container"
|
<Backdrop
|
||||||
component="form"
|
sx={{ color: '#fff', zIndex: (theme) => theme.zIndex.drawer + 1 }}
|
||||||
onSubmit={handleSubmit}
|
open={isLoading}
|
||||||
sx={{
|
|
||||||
'& > :not(style)': { m: 1, width: '25ch' }
|
|
||||||
}}
|
|
||||||
>
|
|
||||||
<CssBaseline />
|
|
||||||
<br />
|
|
||||||
<h2 style={{ width: 'auto' }}>Welcome to SASjs Server!</h2>
|
|
||||||
<TextField
|
|
||||||
id="username"
|
|
||||||
label="Username"
|
|
||||||
type="text"
|
|
||||||
variant="outlined"
|
|
||||||
onChange={(e: any) => setUsername(e.target.value)}
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
<TextField
|
|
||||||
id="password"
|
|
||||||
label="Password"
|
|
||||||
type="password"
|
|
||||||
variant="outlined"
|
|
||||||
onChange={(e: any) => setPassword(e.target.value)}
|
|
||||||
required
|
|
||||||
/>
|
|
||||||
{errorMessage && <span>{errorMessage}</span>}
|
|
||||||
<Button
|
|
||||||
type="submit"
|
|
||||||
variant="outlined"
|
|
||||||
disabled={!appContext.setLoggedIn}
|
|
||||||
>
|
>
|
||||||
Submit
|
<CircularProgress color="inherit" />
|
||||||
</Button>
|
</Backdrop>
|
||||||
</Box>
|
|
||||||
|
<Box
|
||||||
|
className="container"
|
||||||
|
component="form"
|
||||||
|
onSubmit={handleSubmit}
|
||||||
|
sx={{
|
||||||
|
'& > :not(style)': { m: 1, width: '25ch' }
|
||||||
|
}}
|
||||||
|
>
|
||||||
|
<CssBaseline />
|
||||||
|
<br />
|
||||||
|
<h2 style={{ width: 'auto' }}>Welcome to SASjs Server!</h2>
|
||||||
|
<TextField
|
||||||
|
id="username"
|
||||||
|
label="Username"
|
||||||
|
type="text"
|
||||||
|
variant="outlined"
|
||||||
|
onChange={(e: any) => setUsername(e.target.value)}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
<TextField
|
||||||
|
id="password"
|
||||||
|
label="Password"
|
||||||
|
type="password"
|
||||||
|
variant="outlined"
|
||||||
|
onChange={(e: any) => setPassword(e.target.value)}
|
||||||
|
required
|
||||||
|
/>
|
||||||
|
{errorMessage && <span>{errorMessage}</span>}
|
||||||
|
<Button
|
||||||
|
type="submit"
|
||||||
|
variant="outlined"
|
||||||
|
disabled={!appContext.setLoggedIn}
|
||||||
|
>
|
||||||
|
Submit
|
||||||
|
</Button>
|
||||||
|
</Box>
|
||||||
|
</>
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user