Skip to content

Multitenant backend #775

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

Merged
merged 194 commits into from
Aug 1, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
194 commits
Select commit Hold shift + click to select a range
c929672
update test.exs to include optional test setting
YaleChen299 May 28, 2021
a819cb9
Merge branch 'dev/multitenent' of https://github.com/source-academy/c…
YaleChen299 Jun 2, 2021
4398684
initial schema change to account
YaleChen299 May 28, 2021
de88eb1
added schema for course_registration
YaleChen299 Jun 1, 2021
e4c3121
updated accounts query
YaleChen299 Jun 2, 2021
a1d3caf
Removed settings context and shifted sublanguages to courses context
chownces Jun 3, 2021
f4f2aab
Added initial tests for courses context and shifted settings tests over
chownces Jun 3, 2021
37d70d3
Added initial tests for courses context controllers
chownces Jun 3, 2021
92ed28e
Added course table changeset tests
chownces Jun 3, 2021
8091770
updated course_registration context function/getters
YaleChen299 Jun 3, 2021
34f972e
Updated course config functions and tests
chownces Jun 3, 2021
064ea99
Fix filename typo
chownces Jun 4, 2021
e9677d0
Updated endpoint url for course config update to prevent clash with a…
chownces Jun 4, 2021
eaa84ee
Added assesment config routing, functions and tests
chownces Jun 4, 2021
07c27d4
Temporarily fix references to Courses context in miscellaneous files
chownces Jun 4, 2021
9cabbaf
Added context functions and tests for assessment types
chownces Jun 5, 2021
3609fa7
adding course_registration test set
YaleChen299 Jun 5, 2021
d2e607e
Merge branch 'courses-context' into yanyu
YaleChen299 Jun 5, 2021
d0d733e
Updated courses context tests
chownces Jun 5, 2021
5b7ae63
Added update assessment types routing and routing tests
chownces Jun 5, 2021
8bdb5e3
updated course_registration test
YaleChen299 Jun 5, 2021
2249d6a
Updated get course config tests to include assessment types for the s…
chownces Jun 5, 2021
e2935d9
added pipeline for course_registration to assign course_reg in conn
YaleChen299 Jun 5, 2021
1b47d10
Merge remote-tracking branch 'upstream/yanyu' into courses-context
chownces Jun 5, 2021
598c513
Temporary edits to make tests compilable
chownces Jun 5, 2021
31324fb
Merge remote-tracking branch 'upstream/courses-context' into yanyu
chownces Jun 5, 2021
9032a06
Updated admin courses controller routes and test urls
chownces Jun 5, 2021
053bf63
Updated courses controller routes and test urls
chownces Jun 5, 2021
90ed3c9
Update admin courses controller tests
chownces Jun 5, 2021
ed1f1a6
Updated courses context tests
chownces Jun 5, 2021
b81306e
Updated course_registrations function
chownces Jun 5, 2021
7d59959
Follow up on router assign_course
chownces Jun 5, 2021
90ef463
Merge branch 'yanyu' into courses-context
chownces Jun 5, 2021
52119bd
addded course_registration test for changeset
YaleChen299 Jun 6, 2021
185be5b
fix group factory, partial fix for the ecto.setup flow
YaleChen299 Jun 6, 2021
cda1cf3
updated course_registration context function test getters
YaleChen299 Jun 6, 2021
eec0983
Updated sourcecast context functions and tests
chownces Jun 6, 2021
7e29acf
updated test for course_registration insert and update
YaleChen299 Jun 6, 2021
7f2f6ef
updated course_registration test
YaleChen299 Jun 6, 2021
c653241
updated course_registration test
YaleChen299 Jun 6, 2021
8ba9164
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jun 6, 2021
268ae42
Updated sourcecast tests
chownces Jun 6, 2021
a7ab261
Updated assessment types tests
chownces Jun 6, 2021
72aa8fb
Merge branch 'courses-context' into yanyu
YaleChen299 Jun 7, 2021
9c09f16
fix course_registration_test.exs
YaleChen299 Jun 7, 2021
c408f85
Updated sourcecast changeset
chownces Jun 7, 2021
f991d77
Updated stories schema and tests
chownces Jun 7, 2021
e119fb3
upadted assessment schema and relevant test
YaleChen299 Jun 7, 2021
a6cc1f7
Merge branch 'courses-context' into yanyu
YaleChen299 Jun 8, 2021
58ee16d
update assessment factory
YaleChen299 Jun 8, 2021
3370def
updated submissions schema with test, and added db migration
YaleChen299 Jun 8, 2021
40f8eae
added latest_viewed_course in user and course fk to group
YaleChen299 Jun 8, 2021
fecbea4
fix snake case
YaleChen299 Jun 9, 2021
dd1b520
updated accounts context function and adminUserController with test
YaleChen299 Jun 9, 2021
2026d6a
update accounts_test with get_users_by and fix queries with no groups
YaleChen299 Jun 10, 2021
6f32c37
update userController with test(except for stories)
YaleChen299 Jun 12, 2021
28e9972
fix accounts test
YaleChen299 Jun 12, 2021
ce185b3
added latest_viewed context functions with test
YaleChen299 Jun 13, 2021
215cd39
fix snake_case issue
YaleChen299 Jun 13, 2021
cef47b7
update seed.exs for initial test with frontend
YaleChen299 Jun 13, 2021
1b8760e
updated seed with latest_viewed
YaleChen299 Jun 13, 2021
aa02582
fix user view snake_case issue
YaleChen299 Jun 14, 2021
3e06aeb
refactor assessment_config to belong to assessment type with test and…
YaleChen299 Jun 15, 2021
703223c
update_assessment_config: move order from url param to json boday
YaleChen299 Jun 16, 2021
951e2e7
upadte courseName and courseShortName
YaleChen299 Jun 16, 2021
840b20f
update assessment_type test in user controller
YaleChen299 Jun 16, 2021
9f2e174
update seed
YaleChen299 Jun 16, 2021
3173dd1
update admin controller test to test updated result and fix course fi…
YaleChen299 Jun 16, 2021
8c9a8d0
refactor admin_course_controller test
YaleChen299 Jun 16, 2021
fddac6c
fix change of field name in course in user view
YaleChen299 Jun 16, 2021
08c1906
remove grade/max_grade/adjustment in assessments context
YaleChen299 Jun 17, 2021
fb5ee7d
fix assessments show & update submission_votes voter
YaleChen299 Jun 18, 2021
ea7fb6e
fix assessment submit and query avenger_of? with test
YaleChen299 Jun 18, 2021
aa6105b
updated bonus_xp logit with assessment config
YaleChen299 Jun 18, 2021
b2e89ca
update formatting and seed
YaleChen299 Jun 19, 2021
897504b
Updated google claim extractor
chownces Jun 19, 2021
1caa711
Added github auth provider
chownces Jun 19, 2021
44978d9
Namespacing for different auth providers
chownces Jun 19, 2021
dcc506f
Updated dev.secrets.exs.example
chownces Jun 19, 2021
0554b04
Updated seed
chownces Jun 20, 2021
c170b65
Update github auth config
chownces Jun 20, 2021
1b2d92b
Merge branch 'auth' into yanyu
chownces Jun 20, 2021
8886589
Update user seeds
chownces Jun 20, 2021
ded4536
added get assessment config
YaleChen299 Jun 20, 2021
f8f496b
updated config route, combine assessment config table
YaleChen299 Jun 20, 2021
3fed686
debuging for working with frontend
YaleChen299 Jun 21, 2021
980042e
remove decay rate and update assessment config reorder logit with test
YaleChen299 Jun 25, 2021
d742348
Updated sign_in flow and user table to allow for NULL name
chownces Jun 26, 2021
80aa571
refactor reorder logit with test
YaleChen299 Jun 26, 2021
62da75d
Added update_role and delete_user endpoints (#781)
chownces Jun 26, 2021
b11f5a2
tested reorder and mass_upsert_reorder
YaleChen299 Jun 26, 2021
cab3cdb
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jun 26, 2021
c904718
Refactor update_role and delete_course_registration
chownces Jun 26, 2021
a11997a
Merge remote-tracking branch 'upstream/yanyu' into yanyu
chownces Jun 26, 2021
50ed06f
Merge branch 'yanyu' into onboarding
chownces Jun 26, 2021
f9e313a
update test cases and fix some credo issues
YaleChen299 Jun 26, 2021
8c6f854
updated bonus_xp logic
YaleChen299 Jun 26, 2021
eb78555
update notifications with test
YaleChen299 Jun 26, 2021
09bb647
Added add_users endpoint and tests
chownces Jun 26, 2021
1c62478
Merge branch 'yanyu' of https://github.com/source-academy/backend int…
chownces Jun 27, 2021
8a76ce6
Format
chownces Jun 27, 2021
d3ec484
Added create course endpoint and tests
chownces Jun 27, 2021
2d4aeb6
updated notification controller with test
YaleChen299 Jun 27, 2021
3fd8e74
updated assessments context functions with test(skipping contest)
YaleChen299 Jun 27, 2021
b4b7c7e
Merge branch 'yanyu' of https://github.com/source-academy/backend int…
chownces Jun 27, 2021
0dda3c7
updated answer controller with test
YaleChen299 Jun 27, 2021
837cf01
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jun 27, 2021
bbbd909
added delete assessment_config route with test
YaleChen299 Jun 28, 2021
434a3d7
Updated provider tests
chownces Jun 29, 2021
809f06d
Merge branch 'auth' into yanyu
chownces Jun 29, 2021
9bf0cbf
Format
chownces Jun 29, 2021
d2013cf
Temp updates to migration file
chownces Jun 30, 2021
b980e65
Complete migration file
chownces Jun 30, 2021
f36cf1b
remove required in notification
YaleChen299 Jun 30, 2021
8e544a0
fixing test seed and update with migration
YaleChen299 Jun 30, 2021
a33fd00
update assessment controller with test + alter assessment config table
YaleChen299 Jul 1, 2021
58486ac
finalise assessment controller with test
YaleChen299 Jul 1, 2021
d810fc2
Updated assessment config json to proper camelCase
chownces Jul 2, 2021
a20db49
Remove capitalisation of assessment types inside assessment_config ch…
chownces Jul 2, 2021
2543309
update /user call
YaleChen299 Jul 2, 2021
abb8c85
update xml parser for assessment with test
YaleChen299 Jul 2, 2021
a5474b8
updated assessment config booleans
YaleChen299 Jul 3, 2021
9336746
rename /user view field
YaleChen299 Jul 3, 2021
9da4ae9
updated /user endpoint with skippable sent
YaleChen299 Jul 3, 2021
417b4ac
updated admin assessment controller with test
YaleChen299 Jul 3, 2021
aa81d40
update /user call and remove settings test
YaleChen299 Jul 3, 2021
57b89c9
finalised /user call
YaleChen299 Jul 3, 2021
10360bb
fix auth_controller_test
YaleChen299 Jul 3, 2021
2951c77
updated contest test
YaleChen299 Jul 3, 2021
55ae3fc
remove mentor from group
YaleChen299 Jul 3, 2021
14a4466
setting up admin grading controller test
YaleChen299 Jul 3, 2021
6d9d394
Updated admin PUT /users endpoint
chownces Jul 4, 2021
4828abd
Namespace existing usernames in migration file
chownces Jul 4, 2021
9b3cb80
Updated migration file assessment type configs
chownces Jul 4, 2021
35d0156
Updated add users logic
chownces Jul 5, 2021
2dba878
updated admin grading controller with test(less grading summary)
YaleChen299 Jul 5, 2021
9b13366
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jul 5, 2021
1b91e64
merging
YaleChen299 Jul 5, 2021
15cdaed
Updated devices
chownces Jul 5, 2021
af49aff
refactor assessment config booleans to question
YaleChen299 Jul 5, 2021
c578c2c
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jul 5, 2021
351ebf5
code formatting
YaleChen299 Jul 5, 2021
3ff0751
Fix migration file
chownces Jul 5, 2021
0def541
Fix errors when testing with frontend
chownces Jul 5, 2021
75388d5
added isManuallyGraded field to admin grading endpoint
YaleChen299 Jul 5, 2021
3f651fd
fix testcases
YaleChen299 Jul 5, 2021
fb2f35d
delete assessment config deletes relations + tested
YaleChen299 Jul 5, 2021
e4299fc
fix assessment grading view
YaleChen299 Jul 5, 2021
db6f7f8
fix format and credo issues
YaleChen299 Jul 5, 2021
45db4ef
Update migration file
chownces Jul 6, 2021
6ae5609
added unique constaints for assessment number and course_id
YaleChen299 Jul 6, 2021
dbc0e69
Merge branch 'yanyu' of https://github.com/source-academy/cadet into …
YaleChen299 Jul 6, 2021
250dcbd
rename user view crId to courseRegId
chownces Jul 9, 2021
af51543
updated jobs and autograder with test
chownces Jul 9, 2021
6866be5
update assessments controller test
chownces Jul 9, 2021
ab2f58c
updated grading summary with test
chownces Jul 9, 2021
9a48889
fix spec and rename field
chownces Jul 9, 2021
23b3975
reorder grading summary
chownces Jul 9, 2021
a4afef6
fix grader_id in migration
YaleChen299 Jul 9, 2021
0f22c01
grading index filter by course
YaleChen299 Jul 9, 2021
68beb23
read all notifications in the previous course
YaleChen299 Jul 9, 2021
1accd29
prepare for multitenant deploy
YaleChen299 Jul 9, 2021
b242322
prepare for multitenant deploy
YaleChen299 Jul 9, 2021
2219382
Debug workflow
angelsl Jul 9, 2021
e4da6d1
Specify --overwrite
angelsl Jul 9, 2021
d5b2b2f
update init.sh url
YaleChen299 Jul 9, 2021
9a87783
add role in /user call course array
YaleChen299 Jul 10, 2021
62da24f
add role in /user call course array
YaleChen299 Jul 10, 2021
bcccb16
Rebase branch "yanyu" to branch multitenant-deploy
YaleChen299 Jul 10, 2021
fbde058
clean up unused code
YaleChen299 Jul 11, 2021
57dbadd
set latest_viewed_id to nil in users for non-viewable course
YaleChen299 Jul 11, 2021
aad9ed6
update question testcases format
YaleChen299 Jul 13, 2021
54ce4cd
add migration for update testcase format
YaleChen299 Jul 13, 2021
7b00834
update migration
YaleChen299 Jul 13, 2021
6645ebf
Increase upsert users and groups transaction timeout to handle large …
chownces Jul 13, 2021
3c92f55
update admin assets controller test
YaleChen299 Jul 14, 2021
783b1d7
update achievement for multitenant upgrade
YaleChen299 Jul 17, 2021
99df996
fix formatting
YaleChen299 Jul 17, 2021
4979a56
renaming and cleaning up code
YaleChen299 Jul 19, 2021
58c9b6a
rename latest viewed course
YaleChen299 Jul 19, 2021
f99bbe7
add course_reg_id to admin user routes
YaleChen299 Jul 20, 2021
b05b799
update migration
YaleChen299 Jul 20, 2021
bd8c83e
update migration
YaleChen299 Jul 20, 2021
b96e632
update migration
YaleChen299 Jul 20, 2021
069a856
update achievement migration
YaleChen299 Jul 20, 2021
c9afc2d
update contest leaderboard
YaleChen299 Jul 20, 2021
47ddd96
update contest test
YaleChen299 Jul 23, 2021
cbd4ce7
fix assessment config update
YaleChen299 Jul 28, 2021
60b6988
fix source chapter and variant changeset condition
YaleChen299 Jul 29, 2021
e8f119a
fix course changeset and validation
YaleChen299 Jul 29, 2021
20cdee2
simplify function
YaleChen299 Jul 29, 2021
a0fdd71
update delete route
YaleChen299 Jul 29, 2021
5dbc08a
fix issues
YaleChen299 Jul 31, 2021
fd56057
fix migration
YaleChen299 Jul 31, 2021
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
5 changes: 2 additions & 3 deletions .github/workflows/cd.yml
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ on:
branches:
- stable
- master
- multitenant-deploy
paths:
- 'config/**'
- 'lib/**'
Expand Down Expand Up @@ -53,9 +54,7 @@ jobs:
run: |
mix deps.get
- name: mix release
run: |
rm -f _build/prod/cadet-0.0.1.tar.gz
mix release
run: mix release --overwrite
- name: Create release
uses: marvinpinto/action-automatic-releases@latest
with:
Expand Down
11 changes: 11 additions & 0 deletions config/dev.secrets.exs.example
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,17 @@ config :cadet,
# # You may need to write your own claim extractor for other providers
# claim_extractor: Cadet.Auth.Providers.CognitoClaimExtractor
# }},
# # To use authentication with GitHub
# "github" =>
# {Cadet.Auth.Providers.GitHub,
# %{
# # A map of GitHub client_id => client_secret
# clients: %{
# "client_id" => "client_secret"
# },
# token_url: "https://github.com/login/oauth/access_token",
# user_api: "https://api.github.com/user"
# }},
"test" =>
{Cadet.Auth.Providers.Config,
[
Expand Down
14 changes: 7 additions & 7 deletions config/test.exs
Original file line number Diff line number Diff line change
Expand Up @@ -52,22 +52,22 @@ config :cadet,
token: "admin_token",
code: "admin_code",
name: "Test Admin",
username: "admin",
role: :admin
username: "admin"
# role: :admin
},
%{
token: "staff_token",
code: "staff_code",
name: "Test Staff",
username: "staff",
role: :staff
username: "staff"
# role: :staff
},
%{
token: "student_token",
code: "student_code",
name: "Test Student",
username: "student",
role: :student
name: "student 1",
username: "E1234564"
# role: :student
}
]}
},
Expand Down
4 changes: 2 additions & 2 deletions deployment/init.sh
Original file line number Diff line number Diff line change
Expand Up @@ -8,9 +8,9 @@
set -euxo pipefail

BASEDIR=/opt/cadet
PKGURL='https://github.com/source-academy/cadet/releases/download/latest-stable/cadet-0.0.1.tar.gz'
PKGURL='https://github.com/source-academy/cadet/releases/download/latest-multitenant-deploy/cadet-0.0.1.tar.gz'
PKGPATH='/run/cadet-init/cadet-0.0.1.tar.gz'
SVCURL=${SVCURL:-'https://raw.githubusercontent.com/source-academy/cadet/stable/deployment/cadet.service'}
SVCURL=${SVCURL:-'https://raw.githubusercontent.com/source-academy/cadet/multitenant-deploy/deployment/cadet.service'}
SVCPATH='/etc/systemd/system/cadet.service'

if [ "$EUID" -ne 0 ]; then
Expand Down
106 changes: 59 additions & 47 deletions lib/cadet/accounts/accounts.ex
Original file line number Diff line number Diff line change
Expand Up @@ -6,25 +6,16 @@ defmodule Cadet.Accounts do

import Ecto.Query

alias Cadet.Accounts.{Query, User}
alias Cadet.Accounts.{Query, User, CourseRegistration}
alias Cadet.Auth.Provider

@doc """
Register new User entity using Cadet.Accounts.Form.Registration

Returns {:ok, user} on success, otherwise {:error, changeset}
"""
def register(attrs = %{username: username}, role) when is_binary(username) do
attrs |> Map.put(:role, role) |> insert_or_update_user()
end

@doc """
Creates User entity with specified attributes.
"""
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
def register(attrs = %{username: username}) when is_binary(username) do
attrs |> insert_or_update_user()
end

@doc """
Expand Down Expand Up @@ -53,58 +44,79 @@ defmodule Cadet.Accounts do
Repo.get(User, id)
end

@get_all_role ~w(admin staff)a
@doc """
Returns users matching a given set of criteria.
"""
def get_users(filter \\ []) do
User
|> join(:left, [u], g in assoc(u, :group))
|> preload([u, g], group: g)
|> get_users(filter)
def get_users_by(filter \\ [], %CourseRegistration{course_id: course_id, role: role})
when role in @get_all_role do
CourseRegistration
|> where([cr], cr.course_id == ^course_id)
|> join(:inner, [cr], u in assoc(cr, :user))
|> preload([cr, u], user: u)
|> join(:left, [cr, u], g in assoc(cr, :group))
|> preload([cr, u, g], group: g)
|> get_users_helper(filter)
end

defp get_users(query, []), do: Repo.all(query)
defp get_users_helper(query, []), do: Repo.all(query)

defp get_users(query, [{:group, group} | filters]),
do: query |> where([u, g], g.name == ^group) |> get_users(filters)
defp get_users_helper(query, [{:group, group} | filters]),
do: query |> where([cr, u, g], g.name == ^group) |> get_users_helper(filters)

defp get_users(query, [filter | filters]), do: query |> where(^[filter]) |> get_users(filters)
defp get_users_helper(query, [filter | filters]),
do: query |> where(^[filter]) |> get_users_helper(filters)

@spec sign_in(String.t(), Provider.token(), Provider.provider_instance()) ::
{:error, :bad_request | :forbidden | :internal_server_error, String.t()} | {:ok, any}
@doc """
Sign in using given user ID
"""
def sign_in(username, token, provider) do
case Repo.one(Query.username(username)) do
nil ->
# user is not registered in our database
with {:ok, role} <- Provider.get_role(provider, token),
{:ok, name} <- Provider.get_name(provider, token),
{:ok, _} <- register(%{name: name, username: username}, role) do
sign_in(username, name, token)
else
{:error, :invalid_credentials, err} ->
{:error, :forbidden, err}

{:error, :upstream, err} ->
{:error, :bad_request, err}

{:error, _err} ->
{:error, :internal_server_error}
end

user ->
{:ok, user}
user = username |> Query.username() |> Repo.one()

if is_nil(user) or is_nil(user.name) do
# user is not registered in our database or does not have a name
# (accounts pre-created by instructors do not have a name, and has to be fetched
# from the auth provider during sign_in)
with {:ok, name} <- Provider.get_name(provider, token),
{:ok, _} <- register(%{name: name, username: username}) do
sign_in(username, name, token)
else
{:error, :invalid_credentials, err} ->
{:error, :forbidden, err}

{:error, :upstream, err} ->
{:error, :bad_request, err}

{:error, _err} ->
{:error, :internal_server_error}
end
else
{:ok, user}
end
end

def update_game_states(user = %User{}, new_game_state = %{}) do
case user
|> User.changeset(%{game_states: new_game_state})
|> Repo.update() do
result = {:ok, _} -> result
{:error, changeset} -> {:error, {:internal_server_error, full_error_messages(changeset)}}
def update_latest_viewed(user = %User{id: user_id}, latest_viewed_course_id)
when is_ecto_id(latest_viewed_course_id) do
CourseRegistration
|> where(user_id: ^user_id)
|> where(course_id: ^latest_viewed_course_id)
|> Repo.one()
|> case do
nil ->
{:error, {:bad_request, "user is not in the course"}}

_ ->
case user
|> User.changeset(%{latest_viewed_course_id: latest_viewed_course_id})
|> Repo.update() do
result = {:ok, _} ->
result

{:error, changeset} ->
{:error, {:internal_server_error, full_error_messages(changeset)}}
end
end
end
end
31 changes: 31 additions & 0 deletions lib/cadet/accounts/course_registration.ex
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
defmodule Cadet.Accounts.CourseRegistration do
@moduledoc """
The mapping table representing the registration of a user to a course.
"""
use Cadet, :model

alias Cadet.Accounts.{Role, User}
alias Cadet.Courses.{Course, Group}

schema "course_registrations" do
field(:role, Role)
field(:game_states, :map)

belongs_to(:group, Group)
belongs_to(:user, User)
belongs_to(:course, Course)

timestamps()
end

@required_fields ~w(user_id course_id role)a
@optional_fields ~w(game_states group_id)a

def changeset(course_registration, params \\ %{}) do
course_registration
|> cast(params, @optional_fields ++ @required_fields)
|> add_belongs_to_id_from_model([:user, :group, :course], params)
|> validate_required(@required_fields)
|> unique_constraint(:user_id, name: :course_registrations_user_id_course_id_index)
end
end
Loading