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(admin): get admin by id, unselect admin password field #341

Merged
merged 4 commits into from
Sep 22, 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
3 changes: 2 additions & 1 deletion packages/admin/src/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -74,7 +74,8 @@ export default class AdminModule extends IConduitAdmin {
private _sdkRoutes: ConduitRoute[] = [
adminRoutes.getLoginRoute(),
adminRoutes.getCreateAdminRoute(),
adminRoutes.getAdminUsersRoute(),
adminRoutes.getAdminRoute(),
adminRoutes.getAdminsRoute(),
adminRoutes.deleteAdminUserRoute(),
adminRoutes.changePasswordRoute(),
adminRoutes.getReadyRoute(),
Expand Down
2 changes: 1 addition & 1 deletion packages/admin/src/middleware/Auth.middleware.ts
Original file line number Diff line number Diff line change
Expand Up @@ -77,7 +77,7 @@ export function getAuthMiddleware(grpcSdk: ConduitGrpcSdk, conduit: ConduitCommo

Admin.getInstance()
.findOne({ _id: id })
.then((admin: any) => {
.then(admin => {
if (isNil(admin)) {
return res.status(401).json({ error: 'No such user exists' });
}
Expand Down
3 changes: 2 additions & 1 deletion packages/admin/src/models/Admin.schema.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { ConduitActiveSchema, DatabaseProvider, TYPE } from '@conduitplatform/grpc-sdk';

export const schema = {
const schema = {
_id: TYPE.ObjectId,
username: {
type: TYPE.String,
Expand All @@ -9,6 +9,7 @@ export const schema = {
password: {
type: TYPE.String,
required: true,
select: false,
},
hasTwoFA: {
type: TYPE.Boolean,
Expand Down
2 changes: 1 addition & 1 deletion packages/admin/src/models/index.ts
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
export { Admin } from './Admin.schema';
export * from './Admin.schema';
export * from './AdminTwoFactorSecret';
12 changes: 9 additions & 3 deletions packages/admin/src/routes/ChangePassword.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,15 @@ export function changePasswordRoute() {
new ConduitRouteReturnDefinition('ChangePassword', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { oldPassword, newPassword } = params.params!;
const admin = params.context!.admin;
async (req: ConduitRouteParameters) => {
const { oldPassword, newPassword } = req.params!;
const admin = await Admin.getInstance().findOne(
{ _id: req.context!.admin },
'password',
);
if (!admin) {
throw ConduitError.notFound('Authenticated admin no longer exists');
}

if (isNil(oldPassword) || isNil(newPassword)) {
throw new ConduitError(
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/routes/ChangeUsersPassword.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,9 +26,9 @@ export function changeUsersPasswordRoute() {
new ConduitRouteReturnDefinition('ChangePassword', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { adminId, newPassword } = params.params!;
const loggedInAdmin = params.context!.admin;
async (req: ConduitRouteParameters) => {
const { adminId, newPassword } = req.params!;
const loggedInAdmin = req.context!.admin;

if (!loggedInAdmin.isSuperAdmin) {
throw new ConduitError(
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/routes/CreateAdmin.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -24,9 +24,9 @@ export function getCreateAdminRoute() {
new ConduitRouteReturnDefinition('Create', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { username, password } = params.params!;
const loggedInAdmin = params.context!.admin;
async (req: ConduitRouteParameters) => {
const { username, password } = req.params!;
const loggedInAdmin = req.context!.admin;

if (isNil(username) || isNil(password)) {
throw new ConduitError(
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/routes/DeleteAdminUser.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,9 +21,9 @@ export function deleteAdminUserRoute() {
new ConduitRouteReturnDefinition('DeleteAdminUser', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { id } = params.params!;
const loggedInAdmin = params.context!.admin;
async (req: ConduitRouteParameters) => {
const { id } = req.params!;
const loggedInAdmin = req.context!.admin;
if (isNil(id)) {
throw new ConduitError('INVALID_ARGUMENTS', 400, 'Id must be provided');
}
Expand Down
33 changes: 33 additions & 0 deletions packages/admin/src/routes/GetAdmin.route.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
import {
ConduitRouteActions,
ConduitRouteParameters,
ConduitString,
ConduitError,
} from '@conduitplatform/grpc-sdk';
import { Admin } from '../models';
import { ConduitRoute, ConduitRouteReturnDefinition } from '@conduitplatform/hermes';

export function getAdminRoute() {
return new ConduitRoute(
{
path: '/admins/:id',
action: ConduitRouteActions.GET,
description: `Returns an admin user. Passing 'me' as 'id' returns the authenticated admin performing the request`,
urlParams: {
id: ConduitString.Required,
},
},
new ConduitRouteReturnDefinition('GetAdmin', Admin.name),
async (req: ConduitRouteParameters) => {
const adminId = req.params!.id;
const admin: Admin =
adminId === 'me'
? req.context!.admin
: await Admin.getInstance().findOne({ _id: adminId });
if (!admin) {
throw ConduitError.notFound('Admin does not exist');
}
return admin;
},
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -6,9 +6,8 @@ import {
} from '@conduitplatform/grpc-sdk';
import { Admin } from '../models';
import { ConduitRoute, ConduitRouteReturnDefinition } from '@conduitplatform/hermes';
import { schema as AdminSchema } from '../models/Admin.schema';

export function getAdminUsersRoute() {
export function getAdminsRoute() {
return new ConduitRoute(
{
path: '/admins',
Expand All @@ -21,13 +20,13 @@ export function getAdminUsersRoute() {
},
},
new ConduitRouteReturnDefinition('GetAdminUsers', {
admins: [AdminSchema],
admins: [Admin.name],
count: ConduitNumber.Required,
}),
async (params: ConduitRouteParameters) => {
const skip = params.params!.skip ?? 0;
const limit = params.params!.limit ?? 25;
const sort = params.params!.sort;
async (req: ConduitRouteParameters) => {
const skip = req.params!.skip ?? 0;
const limit = req.params!.limit ?? 25;
const sort = req.params!.sort;
const adminsPromise = Admin.getInstance().findMany(
{},
'-password',
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/routes/Login.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -26,8 +26,8 @@ export function getLoginRoute() {
new ConduitRouteReturnDefinition('Login', {
token: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { username, password } = params.params!;
async (req: ConduitRouteParameters) => {
const { username, password } = req.params!;
if (isNil(username) || isNil(password)) {
throw new ConduitError(
'INVALID_ARGUMENTS',
Expand All @@ -36,7 +36,7 @@ export function getLoginRoute() {
);
}

const admin = await Admin.getInstance().findOne({ username });
const admin = await Admin.getInstance().findOne({ username }, 'password');
if (isNil(admin)) {
throw new ConduitError('UNAUTHORIZED', 401, 'Invalid username/password');
}
Expand Down
8 changes: 4 additions & 4 deletions packages/admin/src/routes/ToggleTwoFa.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,10 @@ export function toggleTwoFaRoute() {
new ConduitRouteReturnDefinition('ToggleTwoFaResponse', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { enableTwoFa } = params.params!;
const admin = params.context!.admin;
const context = params.context!;
async (req: ConduitRouteParameters) => {
const { enableTwoFa } = req.params!;
const admin = req.context!.admin;
const context = req.context!;

if (isNil(context) || isNil(admin)) {
throw new GrpcError(status.UNAUTHENTICATED, 'Unauthorized');
Expand Down
8 changes: 4 additions & 4 deletions packages/admin/src/routes/VerifyQrCode.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,11 +22,11 @@ export function verifyQrCodeRoute() {
new ConduitRouteReturnDefinition('VerifyQRCodeResponse', {
message: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const admin = params.context!.admin;
const context = params.context!;
async (req: ConduitRouteParameters) => {
const admin = req.context!.admin;
const context = req.context!;

const { code } = params.params!;
const { code } = req.params!;

if (isNil(context) || isEmpty(context)) {
throw new GrpcError(status.UNAUTHENTICATED, 'User unauthenticated');
Expand Down
6 changes: 3 additions & 3 deletions packages/admin/src/routes/VerifyTwoFa.route.ts
Original file line number Diff line number Diff line change
Expand Up @@ -18,9 +18,9 @@ export function verifyTwoFaRoute() {
new ConduitRouteReturnDefinition('VerifyTwoFaResponse', {
token: ConduitString.Required,
}),
async (params: ConduitRouteParameters) => {
const { code } = params.params!;
const admin = params.context!.admin;
async (req: ConduitRouteParameters) => {
const { code } = req.params!;
const admin = req.context!.admin;
return await verify2Fa(admin, code);
},
);
Expand Down
3 changes: 2 additions & 1 deletion packages/admin/src/routes/index.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export * from './Login.route';
export * from './CreateAdmin.route';
export * from './GetAdminUsers.route';
export * from './GetAdmin.route';
export * from './GetAdmins.route';
export * from './DeleteAdminUser.route';
export * from './ChangePassword.route';
export * from './Ready';
Expand Down