Skip to content

Commit

Permalink
Bug fixes
Browse files Browse the repository at this point in the history
  • Loading branch information
neketka committed Apr 29, 2024
1 parent f41dccd commit d781b21
Show file tree
Hide file tree
Showing 7 changed files with 70 additions and 21 deletions.
7 changes: 7 additions & 0 deletions admin/src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ import { ServerConnectionContext } from "./components/ServerConnection";
import { ServerDataContext } from "./components/ServerData";
import { AlertModal } from "./components/AlertModal";
import { Groups } from "./components/Groups";
import { Achievements } from "./components/Achievements";

const routes = [
{
Expand All @@ -64,6 +65,12 @@ const routes = [
icon: faLocationDot,
name: "Challenges",
},
{
path: "/achievements",
element: <Achievements />,
icon: faTrophy,
name: "Achievements",
},
{
path: "/users",
element: <Users />,
Expand Down
34 changes: 21 additions & 13 deletions admin/src/components/Achievements.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -60,21 +60,20 @@ function AchiemementCard(props: {
{props.achievement.name}
<ButtonSizer>
<HButton onClick={props.onSelect} float="right">
{props.achievement.eventId ? "LINK EVENT" : "UNLINK EVENT"}
{props.achievement.eventId ? "UNLINK EVENT" : "LINK EVENT"}
</HButton>
</ButtonSizer>
</ListCardTitle>
<ListCardDescription>
{props.achievement.description}
</ListCardDescription>
<ListCardBody>
Id: <b>{props.achievement.id}</b>
Id: <b>{props.achievement.id}</b> <br />
Required Points/Event Completions:{" "}
<b>{props.achievement.requiredPoints}</b> <br />
Linked Event ID: <b>{props.achievement.eventId}</b> <br />
Linked Event ID: <b>{props.achievement.eventId ?? "NONE"}</b> <br />
Location Type: <b>{props.achievement.locationType}</b> <br />
Achievement Type: <b>{props.achievement.achievementType}</b> <br />
<br />
</ListCardBody>
<ListCardButtons>
<HButton onClick={props.onDelete}>DELETE</HButton>
Expand Down Expand Up @@ -115,7 +114,7 @@ function fromForm(form: EntryForm[], id: string): AchievementDto {
description: (form[1] as FreeEntryForm).value,
locationType: locationOptions[(form[2] as OptionEntryForm).value],
achievementType: achievementOptions[(form[3] as OptionEntryForm).value],
requiredPoints: (form[3] as NumberEntryForm).value,
requiredPoints: (form[4] as NumberEntryForm).value,
};
}

Expand Down Expand Up @@ -176,7 +175,7 @@ export function Achievements() {
isOpen={isCreateModalOpen}
entryButtonText="CREATE"
onEntry={() => {
serverData.updateEvent({
serverData.updateAchievement({
...fromForm(form, ""),
initialOrganizationId: serverData.selectedOrg,
});
Expand All @@ -192,10 +191,10 @@ export function Achievements() {
isOpen={isEditModalOpen}
entryButtonText="EDIT"
onEntry={() => {
const { challenges } = serverData.events.get(currentId)!;
serverData.updateEvent({
const oldAchievement = serverData.achievements.get(currentId)!;
serverData.updateAchievement({
...oldAchievement,
...fromForm(form, currentId),
challenges,
});
setEditModalOpen(false);
}}
Expand All @@ -205,11 +204,11 @@ export function Achievements() {
form={form}
/>
<DeleteModal
objectName={serverData.events.get(currentId)?.name ?? ""}
objectName={serverData.achievements.get(currentId)?.name ?? ""}
isOpen={isDeleteModalOpen}
onClose={() => setDeleteModalOpen(false)}
onDelete={() => {
serverData.deleteEvent(currentId);
serverData.deleteAchievement(currentId);
setDeleteModalOpen(false);
}}
/>
Expand All @@ -227,12 +226,12 @@ export function Achievements() {
{serverData.selectedOrg === "" ? (
<CenterText>Select an organization to view achievements</CenterText>
) : serverData.organizations.get(serverData.selectedOrg) ? (
serverData.organizations?.get(serverData.selectedOrg)?.events
serverData.organizations?.get(serverData.selectedOrg)?.achivements
?.length === 0 && (
<CenterText>No achievements in organization</CenterText>
)
) : (
<CenterText>Error getting events</CenterText>
<CenterText>Error getting achievements</CenterText>
)}
{Array.from<AchievementDto>(
serverData.organizations
Expand All @@ -254,6 +253,15 @@ export function Achievements() {
key={ach.id}
achievement={ach}
onSelect={() => {
if (ach.eventId) {
serverData.updateAchievement({
...ach,
eventId: "",
});

return;
}

if (serverData.selectedEvent === "") {
setLinkedModalOpen(true);
} else {
Expand Down
15 changes: 14 additions & 1 deletion admin/src/components/ServerData.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -143,7 +143,7 @@ export function ServerDataProvider(props: { children: ReactNode }) {
if (data.deleted) {
serverData.achievements.delete(data.achievement.id);
} else {
serverData.challenges.set(
serverData.achievements.set(
(data.achievement as AchievementDto).id,
data.achievement as AchievementDto
);
Expand Down Expand Up @@ -218,12 +218,25 @@ export function ServerDataProvider(props: { children: ReactNode }) {
(data.organization as OrganizationDto).id
)?.events ?? [];

const oldAchievements =
serverData.organizations.get(
(data.organization as OrganizationDto).id
)?.achivements ?? [];

sock.requestEventData({
events: (data.organization as OrganizationDto).events?.filter(
(ev: string) => !(ev in oldEvents)
),
});

if (data.organization.achivements) {
sock.requestAchievementData({
achievements: data.organization.achivements?.filter(
(achId) => !(achId in oldAchievements)
),
});
}

serverData.organizations.set(
(data.organization as OrganizationDto).id,
data.organization as OrganizationDto
Expand Down
5 changes: 2 additions & 3 deletions server/src/achievement/achievement.e2e-spec.ts
Original file line number Diff line number Diff line change
Expand Up @@ -126,7 +126,6 @@ describe('AchievementModule E2E', () => {
fullAbility,
achDto,
);
console.log(ach);

const findAch = await prisma.achievement.findFirstOrThrow({
where: { id: ach!.id },
Expand Down Expand Up @@ -155,7 +154,7 @@ describe('AchievementModule E2E', () => {
it('should update an achievement: upsertAchievementFromDto', async () => {
const achId = (await prisma.achievement.findFirstOrThrow()).id;
const test = (await achievementService.getAchievementFromId(achId))
.imageUrl;
?.imageUrl;
console.log('before: ' + test);
const orgUsage = OrganizationSpecialUsage;
const orgId = (
Expand All @@ -180,7 +179,7 @@ describe('AchievementModule E2E', () => {
});
const testAfterUpdate = (
await achievementService.getAchievementFromId(achId)
).imageUrl;
)?.imageUrl;
console.log('after: ' + testAfterUpdate);

expect(ach.imageUrl).toEqual('update test');
Expand Down
9 changes: 8 additions & 1 deletion server/src/achievement/achievement.gateway.ts
Original file line number Diff line number Diff line change
Expand Up @@ -21,13 +21,15 @@ import { UserAbility } from '../casl/user-ability.decorator';
import { AppAbility } from '../casl/casl-ability.factory';
import { Action } from '../casl/action.enum';
import { subject } from '@casl/ability';
import { OrganizationService } from '../organization/organization.service';

@WebSocketGateway({ cors: true })
@UseGuards(UserGuard, PoliciesGuard)
export class AchievementGateway {
constructor(
private achievementService: AchievementService,
private clientService: ClientService,
private orgService: OrganizationService,
) {}

/**
Expand All @@ -47,7 +49,7 @@ export class AchievementGateway {
ability,
data.achievements,
);
console.log(achs.length);

for (const ach of achs) {
await this.achievementService.emitUpdateAchievementData(ach, false, user);
}
Expand Down Expand Up @@ -101,6 +103,11 @@ export class AchievementGateway {
return;
}

const org = await this.orgService.getOrganizationById(
data.achievement.initialOrganizationId!,
);

await this.orgService.emitUpdateOrganizationData(org, false);
this.clientService.subscribe(user, achievement.id);
await this.achievementService.emitUpdateAchievementData(
achievement,
Expand Down
2 changes: 2 additions & 0 deletions server/src/achievement/achievement.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { PrismaModule } from '../prisma/prisma.module';
import { AchievementGateway } from './achievement.gateway';
import { AchievementService } from './achievement.service';
import { CaslModule } from '../casl/casl.module';
import { OrganizationModule } from '../organization/organization.module';

@Module({
imports: [
Expand All @@ -14,6 +15,7 @@ import { CaslModule } from '../casl/casl.module';
EventModule,
PrismaModule,
CaslModule,
OrganizationModule,
],
exports: [AchievementService],
providers: [AchievementGateway, AchievementService],
Expand Down
19 changes: 16 additions & 3 deletions server/src/achievement/achievement.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -34,7 +34,7 @@ export class AchievementService {

/** get an achievement by its ID */
async getAchievementFromId(id: string) {
return await this.prisma.achievement.findFirstOrThrow({ where: { id } });
return await this.prisma.achievement.findFirst({ where: { id } });
}

/** get list of achievements by IDs, based on ability */
Expand Down Expand Up @@ -71,6 +71,16 @@ export class AchievementService {
},
})) > 0;

const canUpdateEv =
(await this.prisma.eventBase.count({
where: {
AND: [
accessibleBy(ability, Action.Update).EventBase,
{ id: achievement.eventId ?? '' },
],
},
})) > 0;

const canUpdateAch =
(await this.prisma.achievement.count({
where: {
Expand All @@ -89,6 +99,10 @@ export class AchievementService {
imageUrl: achievement.imageUrl?.substring(0, 2048),
locationType: achievement.locationType as LocationType,
achievementType: achievement.achievementType as AchievementTypeDto,
linkedEventId:
achievement.eventId && achievement.eventId !== '' && canUpdateEv
? achievement.eventId
: null,
};
const data = await this.abilityFactory.filterInaccessible(
ach.id,
Expand All @@ -115,8 +129,7 @@ export class AchievementService {
defaultAchievementData.imageUrl,
locationType: achievement.locationType as LocationType,
achievementType: achievement.achievementType as AchievementTypeDto,
// eventIndex: assignData.eventId ?? 0, // check
requiredPoints: achievement.requiredPoints ?? 0,
requiredPoints: achievement.requiredPoints ?? 1,
organizations: { connect: { id: achievement.initialOrganizationId } },
};

Expand Down

0 comments on commit d781b21

Please sign in to comment.