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: Achievements #866

Merged
merged 73 commits into from
Jan 28, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
73 commits
Select commit Hold shift + click to select a range
31d45ea
add Readme
LomyW Oct 20, 2023
65d68a1
Merge branch 'master' into feat/achievements
LomyW Oct 23, 2023
d9f4c2d
Merge branch 'master' into feat/achievements
LomyW Nov 2, 2023
4be6a2d
Merge branch 'master' into feat/achievements
LomyW Nov 6, 2023
ad03043
Merge branch 'master' into feat/achievements
LomyW Nov 13, 2023
c598ec5
Merge branch 'master' into feat/achievements
LomyW Nov 14, 2023
d26339b
feat: achievement.actionTaken() (#887)
LomyW Nov 15, 2023
ce66a59
feat: track achievement event (#892)
LomyW Nov 17, 2023
1118ead
Merge branch 'master' into feat/achievements
LomyW Nov 20, 2023
f543bde
Merge branch 'master' into feat/achievements
LomyW Nov 20, 2023
8fadc8c
Merge branch 'master' into feat/achievements
LomyW Nov 21, 2023
aaa8f0e
feat: achievement standard aggregators (#893)
LomyW Nov 27, 2023
ed1cf5e
Merge branch 'master' into feat/achievements
LomyW Nov 30, 2023
b4bfe24
Merge branch 'master' into feat/achievements
LomyW Dec 4, 2023
ce7257e
feat: evaluation of achievements (#898)
LomyW Dec 7, 2023
c59b3b9
feat: achievements resolver (#903)
LucasFalkowsky Dec 11, 2023
324d20e
feat: achievement notification (#924)
LucasFalkowsky Dec 12, 2023
3013751
chore: todos
LucasFalkowsky Dec 13, 2023
183fe89
chore: todos
LucasFalkowsky Dec 14, 2023
14ce44a
feat: invoke achievement action taken (#913)
LomyW Dec 14, 2023
c42ff66
Merge remote-tracking branch 'origin/master' into feat/achievements
LomyW Dec 18, 2023
6bfd232
feature: add tracing to achievement system (#935)
dhenkel92 Dec 19, 2023
1d384a3
fix: change requests
LucasFalkowsky Dec 19, 2023
108ea6f
fix: global achievements (#931)
LucasFalkowsky Dec 20, 2023
eeeafc7
fix: add relation to group keys
LucasFalkowsky Dec 20, 2023
75ea75b
fix: completed progress description
LucasFalkowsky Dec 20, 2023
3c8ba94
Create evaluate unit tests (#943)
dhenkel92 Jan 8, 2024
33a0c40
Merge branch 'master' into feat/achievements
dhenkel92 Jan 8, 2024
01d91c2
feature: use remote s3 URL for achievement images (#946)
dhenkel92 Jan 11, 2024
7e79a50
feat: achievement notifications (#945)
LomyW Jan 11, 2024
af827c4
fix: use proper subcourse relation
dhenkel92 Jan 11, 2024
a0cae61
feature: add _userActionTaken admin mutation to test gamification
dhenkel92 Jan 11, 2024
e23fc60
feature: add more logs to achievement system
dhenkel92 Jan 13, 2024
b7657de
fix: unit tests should work in ci
dhenkel92 Jan 14, 2024
b73b3dc
fix: get correct active achievement, fixed image alignment
LucasFalkowsky Jan 15, 2024
3f506bb
Merge branch 'master' into feat/achievements
LomyW Jan 16, 2024
b3cfa90
feat: subcourse meeting join
LucasFalkowsky Jan 19, 2024
ca14256
feat: conduct subcourse appointment metric and mutation adjustments
LucasFalkowsky Jan 19, 2024
429bb08
fix: unit tests should work in ci (#958)
dhenkel92 Jan 20, 2024
70831c4
Update common/achievement/util.ts
LucasFalkowsky Jan 22, 2024
692761d
Merge branch 'master' into feat/achievements
LomyW Jan 23, 2024
d729ed4
fix: change requests
LucasFalkowsky Jan 23, 2024
64f5837
fix: reduce function for template by metric check
LucasFalkowsky Jan 23, 2024
41392ec
Feat: offer course template (#951)
LucasFalkowsky Jan 23, 2024
ccdd4a2
fix: check for subcourses before course submit
LucasFalkowsky Jan 23, 2024
762f688
fix: create course achievement
LucasFalkowsky Jan 23, 2024
66f9248
some bugs
LomyW Jan 23, 2024
e2f6c12
fix: display right next step achievements
LucasFalkowsky Jan 23, 2024
a54293d
fix seed data
LomyW Jan 23, 2024
dfe7ed3
fix: add information to action
LucasFalkowsky Jan 23, 2024
4984c60
fix: update seed file
LucasFalkowsky Jan 23, 2024
e647477
fix: revert redirect link
LucasFalkowsky Jan 23, 2024
7b435fd
fix: lecture filtering
LucasFalkowsky Jan 24, 2024
c794919
fix final notification for sequentials
LomyW Jan 24, 2024
8d09d9c
Merge branch 'master' into feat/achievements
LomyW Jan 24, 2024
8f9afec
changes requested
LucasFalkowsky Jan 24, 2024
8f879da
iterate over all subcourses for update
dhenkel92 Jan 25, 2024
9462e8d
Use relation for identification (#965)
dhenkel92 Jan 25, 2024
89fbfce
fix: requested changes
LucasFalkowsky Jan 25, 2024
49dc8e5
feat: achievement integration tests (#956)
LucasFalkowsky Jan 25, 2024
98ed602
fix: unit tests
dhenkel92 Jan 27, 2024
a1d23f3
fix: achievement identification
dhenkel92 Jan 27, 2024
6c48d0d
fix: typesystem for achievements (#966)
dhenkel92 Jan 27, 2024
46df9ed
fix: check access before update
dhenkel92 Jan 27, 2024
1838fcc
chore: remove redundant metrics field from achievement template (#968)
dhenkel92 Jan 27, 2024
828684c
remove condition replacement in get achievement
dhenkel92 Jan 27, 2024
0b31361
always iterate over all subcourses
dhenkel92 Jan 27, 2024
0da4954
Remove group from ua (#969)
dhenkel92 Jan 28, 2024
7e8ce08
feature: add dedicated relation field to user achievement table (#970)
dhenkel92 Jan 28, 2024
6185dbe
fix: typos
dhenkel92 Jan 28, 2024
f1997dc
move action inside publish subcourse
dhenkel92 Jan 28, 2024
c0fc304
chore: squash achievement migrations (#971)
dhenkel92 Jan 28, 2024
15741a7
move db actions to common achievement folder
dhenkel92 Jan 28, 2024
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 .env.example
Original file line number Diff line number Diff line change
Expand Up @@ -69,4 +69,5 @@ ZOOM_ACCOUNT_ID=
ZOOM_MEETING_SDK_CLIENT_ID=
ZOOM_MEETING_SDK_CLIENT_SECRET=

ZOOM_ACTIVE=
ZOOM_ACTIVE=
GAMIFICATION_ACTIVE=
4 changes: 3 additions & 1 deletion .env.integration-tests
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ ZOOM_MEETING_SDK_CLIENT_SECRET="ZOOM_MEETING_SDK_CLIENT_SECRET"
ZOOM_MEETING_SDK_CLIENT_ID="ZOOM_MEETING_SDK_CLIENT_ID"
ZOOM_API_KEY="ZOOM_API_KEY"
ZOOM_API_SECRET="ZOOM_API_SECRET"
ZOOM_ACCOUNT_ID="ZOOM_ACCOUNT_ID"
ZOOM_ACCOUNT_ID="ZOOM_ACCOUNT_ID"

GAMIFICATION_ACTIVE=true
4 changes: 3 additions & 1 deletion .env.integration-tests.debug
Original file line number Diff line number Diff line change
Expand Up @@ -17,4 +17,6 @@ ZOOM_MEETING_SDK_CLIENT_SECRET="ZOOM_MEETING_SDK_CLIENT_SECRET"
ZOOM_MEETING_SDK_CLIENT_ID="ZOOM_MEETING_SDK_CLIENT_ID"
ZOOM_API_KEY="ZOOM_API_KEY"
ZOOM_API_SECRET="ZOOM_API_SECRET"
ZOOM_ACCOUNT_ID="ZOOM_ACCOUNT_ID"
ZOOM_ACCOUNT_ID="ZOOM_ACCOUNT_ID"

GAMIFICATION_ACTIVE=true
2 changes: 1 addition & 1 deletion .github/workflows/node.js.yml
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ name: Master Barrier

on:
pull_request:
branches: [master]
types: ['opened', 'edited', 'reopened', 'synchronize']

jobs:
integration:
Expand Down
113 changes: 113 additions & 0 deletions common/achievement/aggregator.spec.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import { aggregators } from './aggregator';

describe('test sum aggregator', () => {
const tests: {
name: string;
elements: number[];
expected: number;
}[] = [
{
name: 'should sum all elements in array',
elements: [1, 2, 3, 4, 5],
expected: 15,
},
{
name: 'should return 0 for empty array',
elements: [],
expected: 0,
},
];

it.each(tests)('$name', ({ elements, expected }) => {
expect(aggregators['sum'].function(elements)).toEqual(expected);
});
});

describe('test count aggregator', () => {
const tests: {
name: string;
elements: number[];
expected: number;
}[] = [
{
name: 'should count all elements in array',
elements: [1, 2, 3, 4, 5],
expected: 5,
},
{
name: 'should return 0 for empty array',
elements: [],
expected: 0,
},
{
name: 'should skip elements that are zero',
elements: [1, 0, 3, 0, 5],
expected: 3,
},
];

it.each(tests)('$name', ({ elements, expected }) => {
expect(aggregators['count'].function(elements)).toEqual(expected);
});
});

describe('test presenceOfEvents aggregator', () => {
const tests: {
name: string;
elements: number[];
expected: number;
}[] = [
{
name: 'should return 1 if at least one element is present',
elements: [1, 2, 3, 4, 5],
expected: 1,
},
{
name: 'should return 0 for empty array',
elements: [],
expected: 0,
},
{
name: 'should return 0 if all elements are zero',
elements: [0, 0, 0, 0, 0],
expected: 0,
},
];

it.each(tests)('$name', ({ elements, expected }) => {
expect(aggregators['presenceOfEvents'].function(elements)).toEqual(expected);
});
});

describe('test lastStreakLength aggregator', () => {
const tests: {
name: string;
elements: number[];
expected: number;
}[] = [
{
name: 'should get a streak of five',
elements: [1, 2, 3, 4, 5],
expected: 5,
},
{
name: 'should not have a streak if no elements are present',
elements: [],
expected: 0,
},
{
name: 'should reset streak if zero in chain',
elements: [1, 1, 1, 0, 1],
expected: 3,
},
{
name: 'should have a streak of 0 if first element is zero',
elements: [0, 1, 1, 1, 1],
expected: 0,
},
];

it.each(tests)('$name', ({ elements, expected }) => {
expect(aggregators['lastStreakLength'].function(elements)).toEqual(expected);
});
});
32 changes: 31 additions & 1 deletion common/achievement/aggregator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,34 @@ type Aggregator = Record<string, AggregatorFunction>;

// Aggregators are needed to aggregate event values (achievement_event.value) or buckets for evaluation (like sum, count, max, min, avg)

export const aggregators: Aggregator = {};
export const aggregators: Aggregator = {
sum: {
function: (elements): number => {
return elements.reduce((total, num) => total + num, 0);
},
},
count: {
function: (elements): number => {
return elements.filter((num) => num != 0).length;
},
},
// this aggregator should be used to check if min one event exist in a bucket, i.e. if one event happend in one week / one month
presenceOfEvents: {
function: (elements): number => {
return elements.filter((num) => num != 0).length > 0 ? 1 : 0;
},
},
lastStreakLength: {
function: (elements): number => {
// elements are sorted desc, i.e. [KW 52, KW 51, KW 50]
let value = 0;
for (const element of elements) {
if (element === 0) {
break;
}
value += 1;
}
return value;
},
},
};
Loading
Loading