Change models, new migrations, fix front and make tests work

Signed-off-by: Thomas Citharel <tcit@tcit.fr>
This commit is contained in:
Thomas Citharel 2018-01-13 23:33:03 +01:00
parent 92d2045735
commit 20cd1bb579
186 changed files with 2982 additions and 3214 deletions

View File

@ -27,5 +27,11 @@ config :logger, :console,
import_config "#{Mix.env}.exs" import_config "#{Mix.env}.exs"
config :eventos, EventosWeb.Guardian, config :eventos, EventosWeb.Guardian,
issuer: "Eventos", issuer: "eventos",
secret_key: "ty0WM7YBE3ojvxoUQxo8AERrNpfbXnIJ82ovkPdqbUFw31T5LcK8wGjaOiReVQjo" secret_key: "ty0WM7YBE3ojvxoUQxo8AERrNpfbXnIJ82ovkPdqbUFw31T5LcK8wGjaOiReVQjo"
config :guardian, Guardian.DB,
repo: Eventos.Repo,
schema_name: "guardian_tokens", # default
token_types: ["refresh_token"], # store all token types if not set
sweep_interval: 60 # default: 60 minutes

View File

@ -50,6 +50,7 @@ config :phoenix, :stacktrace_depth, 20
# Configure your database # Configure your database
config :eventos, Eventos.Repo, config :eventos, Eventos.Repo,
adapter: Ecto.Adapters.Postgres, adapter: Ecto.Adapters.Postgres,
types: Eventos.PostgresTypes,
username: "elixir", username: "elixir",
password: "elixir", password: "elixir",
database: "eventos_dev", database: "eventos_dev",

View File

@ -7,7 +7,10 @@ config :eventos, EventosWeb.Endpoint,
server: false server: false
# Print only warnings and errors during test # Print only warnings and errors during test
config :logger, level: :warn config :logger,
backends: [:console],
compile_time_purge_level: :debug,
level: :info
# Configure your database # Configure your database
config :eventos, Eventos.Repo, config :eventos, Eventos.Repo,
@ -16,4 +19,5 @@ config :eventos, Eventos.Repo,
password: "elixir", password: "elixir",
database: "eventos_test", database: "eventos_test",
hostname: "localhost", hostname: "localhost",
pool: Ecto.Adapters.SQL.Sandbox pool: Ecto.Adapters.SQL.Sandbox,
types: Eventos.PostgresTypes

View File

@ -4,7 +4,7 @@ var path = require('path')
module.exports = { module.exports = {
build: { build: {
env: require('./prod.env'), env: require('./prod.env'),
index: path.resolve(__dirname, '../../lib/eventos_web/templates/app/index.html.eex'), index: path.resolve(__dirname, '../../lib/eventos_web/templates/page/index.html.eex'),
assetsRoot: path.resolve(__dirname, '../../priv/static'), assetsRoot: path.resolve(__dirname, '../../priv/static'),
assetsSubDirectory: '', assetsSubDirectory: '',
assetsPublicPath: '/', assetsPublicPath: '/',

View File

@ -4,11 +4,11 @@
<link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet"> <link href='https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons' rel="stylesheet">
<script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBF37pw38j0giICt73TCAPNogc07Upe_Q4&libraries=places"></script> <script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBF37pw38j0giICt73TCAPNogc07Upe_Q4&libraries=places"></script>
<meta charset="utf-8"> <meta charset="utf-8">
<title>libre-event</title> <title>Eventos</title>
</head> </head>
<body> <body>
<noscript> <noscript>
Mets du JS. You need to activate your JS doug.
</noscript> </noscript>
<div id="app"></div> <div id="app"></div>
<!-- built files will be auto injected --> <!-- built files will be auto injected -->

6
js/package-lock.json generated
View File

@ -13648,9 +13648,9 @@
} }
}, },
"vuetify": { "vuetify": {
"version": "0.17.6", "version": "1.0.0-beta.2",
"resolved": "https://registry.npmjs.org/vuetify/-/vuetify-0.17.6.tgz", "resolved": "https://registry.npmjs.org/vuetify/-/vuetify-1.0.0-beta.2.tgz",
"integrity": "sha512-geIGnXjYEhUn1dr+g8FCFqvV6xUbALXNJ3UZQ32T0SJdGJh/JLsScINTxV+Pxt1F36s+YRnuFyHLiFOSnuVzjA==" "integrity": "sha512-eM61PPNwM0lXYaUzY0MXA7sp/N4wqxlEMcALsOBneLObVS+OgpX4Zszb7HqAOSVXipNRSP8X5ZV5TgbZscly1Q=="
}, },
"vuetify-google-autocomplete": { "vuetify-google-autocomplete": {
"version": "1.1.0", "version": "1.1.0",

View File

@ -21,7 +21,7 @@
"vue-markdown": "^2.2.4", "vue-markdown": "^2.2.4",
"vue-router": "^3.0.1", "vue-router": "^3.0.1",
"vue2-google-maps": "^0.8.4", "vue2-google-maps": "^0.8.4",
"vuetify": "^0.17.6", "vuetify": "^1.0.0-beta.2",
"vuetify-google-autocomplete": "^1.1.0", "vuetify-google-autocomplete": "^1.1.0",
"vuex": "^2.5.0", "vuex": "^2.5.0",
"vuex-i18n": "1.8.0" "vuex-i18n": "1.8.0"

View File

@ -76,7 +76,6 @@
<script> <script>
import auth from '@/auth/index';
import NavBar from '@/components/NavBar'; import NavBar from '@/components/NavBar';
export default { export default {
@ -105,15 +104,7 @@ export default {
show_new_event_button: false, show_new_event_button: false,
}; };
}, },
created() {
this.checkAuthMethod();
},
methods: { methods: {
checkAuthMethod() {
if (auth.checkAuth(this.$store)) {
this.show_new_event_button = true;
}
},
showMenuItem(elem) { showMenuItem(elem) {
return elem !== null && this.$store.state.user && this.$store.state.user.roles !== undefined ? this.$store.state.user.roles.includes(elem) : true; return elem !== null && this.$store.state.user && this.$store.state.user.roles !== undefined ? this.$store.state.user.roles.includes(elem) : true;
}, },

View File

@ -1,6 +1,6 @@
import { API_HOST, API_PATH } from './_entrypoint'; import { API_HOST, API_PATH } from './_entrypoint';
const jsonLdMimeType = 'application/ld+json'; const jsonLdMimeType = 'application/json';
export default function eventFetch(url, store, optionsarg = {}) { export default function eventFetch(url, store, optionsarg = {}) {
const options = optionsarg; const options = optionsarg;

View File

@ -1,87 +1,61 @@
import router from '../router/index';
import { API_HOST, API_PATH } from '../api/_entrypoint'; import { API_HOST, API_PATH } from '../api/_entrypoint';
// URL and endpoint constants // URL and endpoint constants
const LOGIN_URL = `${API_HOST}${API_PATH}/login`; const LOGIN_URL = `${API_HOST}${API_PATH}/login`;
const SIGNUP_URL = `${API_HOST}${API_PATH}/users/`; const SIGNUP_URL = `${API_HOST}${API_PATH}/users/`;
const CHECK_AUTH = `${API_HOST}${API_PATH}/users/`; const CHECK_AUTH = `${API_HOST}${API_PATH}/user/`;
const REFRESH_TOKEN = `${API_HOST}${API_PATH}/token/refresh`; const REFRESH_TOKEN = `${API_HOST}${API_PATH}/token/refresh`;
function AuthError(field, message) {
this.field = field;
this.message = message;
}
AuthError.prototype.toString = function AuthErrorToString() {
return `AuthError: ${this.message}`;
};
export default { export default {
// User object will let us check authentication status
user: false,
authenticated: false,
token: false,
// Send a request to the login URL and save the returned JWT // Send a request to the login URL and save the returned JWT
login(creds, $store, redirect, error) { login(creds, success, error) {
fetch(LOGIN_URL, { method: 'POST', body: creds, headers: { 'Content-Type': 'application/json' } }) fetch(LOGIN_URL, { method: 'POST', body: creds, headers: { 'Content-Type': 'application/json' } })
.then(response => response.json()) .then((response) => {
.then((data) => { if (response.status === 200) {
if (data.code >= 300) { return response.json();
throw new AuthError(null, data.message);
} }
$store.commit('LOGIN_USER'); throw response.json();
})
.then((data) => {
localStorage.setItem('token', data.token); localStorage.setItem('token', data.token);
localStorage.setItem('refresh_token', data.refresh_token); // localStorage.setItem('refresh_token', data.refresh_token);
this.getUser( return success(data);
$store, })
() => router.push(redirect) .catch(err => error(err));
);
}).catch((err) => {
error(err);
});
}, },
signup(creds, $store, redirect, error) { signup(creds, success, error) {
fetch(SIGNUP_URL, { method: 'POST', body: creds, headers: { 'Content-Type': 'application/json' } }) fetch(SIGNUP_URL, { method: 'POST', body: creds, headers: { 'Content-Type': 'application/json' } })
.then(response => response.json()) .then((response) => {
if (response.status === 200) {
return response.json();
}
throw response.json();
})
.then((data) => { .then((data) => {
if (data.error) {
throw new AuthError(data.error.field, data.error.message);
}
$store.commit('LOGIN_USER');
localStorage.setItem('token', data.token); localStorage.setItem('token', data.token);
localStorage.setItem('refresh_token', data.refresh_token); // localStorage.setItem('refresh_token', data.refresh_token);
if (redirect) { return success(data);
router.push(redirect); }).catch(err => error(err));
}
}).catch((err) => {
error(err);
});
}, },
refreshToken(store, successHandler, errorHandler) { refreshToken(store, successHandler, errorHandler) {
const refreshToken = localStorage.getItem('refresh_token'); const refreshToken = localStorage.getItem('refresh_token');
console.log("We are refreshing the jwt token"); console.log('We are refreshing the jwt token');
fetch(REFRESH_TOKEN, { method: 'POST', body: JSON.stringify({refresh_token: refreshToken}), headers: { 'Content-Type': 'application/json' }}) fetch(REFRESH_TOKEN, { method: 'POST', body: JSON.stringify({ refresh_token: refreshToken }), headers: { 'Content-Type': 'application/json' } })
.then((response) => { .then((response) => {
if (response.ok) { if (response.ok) {
return response.json(); return response.json();
} else {
errorHandler('Error while authenticating');
} }
return errorHandler('Error while authenticating');
}) })
.then((response) => { .then((response) => {
console.log("We have a new token"); console.log('We have a new token');
this.authenticated = true; this.authenticated = true;
store.commit('LOGIN_USER', response); store.commit('LOGIN_USER', response);
localStorage.setItem('token', response.token); localStorage.setItem('token', response.token);
console.log("Let's try to auth again"); console.log("Let's try to auth again");
this.getUser(store, successHandler, errorHandler);
successHandler(); successHandler();
}); });
}, },
@ -114,19 +88,8 @@ export default {
return expirationDate < new Date(); return expirationDate < new Date();
}, },
checkAuth(store = null) {
const token = localStorage.getItem('token');
if (store && token) {
this.getUser(store,() => null, () => null);
}
/* if (!!token && store && !this.isTokenExpired(token)) {
this.refreshToken(store, () => null, () => null);
} */
return !!token;
},
getUser(store, successHandler, errorHandler) { getUser(store, successHandler, errorHandler) {
console.log("We are checking the auth"); console.log('We are checking the auth');
this.token = localStorage.getItem('token'); this.token = localStorage.getItem('token');
const options = {}; const options = {};
options.headers = new Headers(); options.headers = new Headers();
@ -135,15 +98,13 @@ export default {
.then((response) => { .then((response) => {
if (response.ok) { if (response.ok) {
return response.json(); return response.json();
} else {
errorHandler('Error while authenticating');
} }
}) return errorHandler('Error while authenticating');
.then((response) => { }).then((response) => {
this.authenticated = true; this.authenticated = true;
console.log(response); console.log(response);
store.commit('SAVE_USER', response); store.commit('LOAD_USER', response.data);
successHandler(); return successHandler();
}); });
}, },

View File

@ -29,11 +29,16 @@
:src="account.avatarRemoteUrl" :src="account.avatarRemoteUrl"
> >
</v-avatar> </v-avatar>
<v-card-title class="pl-5 pt-5">
<div class="display-1 pl-5 pt-5">@{{ account.username }}<span v-if="account.server">@{{ account.server.address }}</span></div>
</v-card-title>
<v-card-text v-if="account.description" v-html="account.description"></v-card-text>
</div> </div>
<v-container fluid grid-list-lg>
<v-layout row>
<v-flex xs7>
<div class="headline">{{ account.display_name }}</div>
<div><span class="subheading">@{{ account.username }}</span><span v-if="account.server">@{{ account.server.address }}</span></div>
<v-card-text v-if="account.description" v-html="account.description"></v-card-text>
</v-flex>
</v-layout>
</v-container>
</v-layout> </v-layout>
<v-list three-line> <v-list three-line>
<v-list-tile> <v-list-tile>
@ -69,7 +74,7 @@
</v-list-tile-content> </v-list-tile-content>
</v-list-tile> </v-list-tile>
</v-list> </v-list>
<v-container fluid grid-list-md v-if="account.participatingEvents.length > 0"> <v-container fluid grid-list-md v-if="account.participatingEvents && account.participatingEvents.length > 0">
<v-subheader>Participated at</v-subheader> <v-subheader>Participated at</v-subheader>
<v-layout row wrap> <v-layout row wrap>
<v-flex v-for="event in account.participatingEvents" :key="event.id"> <v-flex v-for="event in account.participatingEvents" :key="event.id">
@ -110,7 +115,7 @@
</v-flex> </v-flex>
</v-layout> </v-layout>
</v-container> </v-container>
<v-container fluid grid-list-md v-if="account.organizingEvents.length > 0"> <v-container fluid grid-list-md v-if="account.organizingEvents && account.organizingEvents.length > 0">
<v-subheader>Organized events</v-subheader> <v-subheader>Organized events</v-subheader>
<v-layout row wrap> <v-layout row wrap>
<v-flex v-for="event in account.organizingEvents" :key="event.id"> <v-flex v-for="event in account.organizingEvents" :key="event.id">
@ -178,11 +183,12 @@ export default {
}, },
methods: { methods: {
fetchData() { fetchData() {
eventFetch('/accounts/' + this.id, this.$store) eventFetch(`/accounts/${this.id}`, this.$store)
.then(response => response.json()) .then(response => response.json())
.then((response) => { .then((response) => {
this.account = response; this.account = response.data;
this.loading = false; this.loading = false;
console.log(this.account);
}) })
} }
} }

View File

@ -4,11 +4,10 @@
<v-form> <v-form>
<v-text-field <v-text-field
label="Name of the category" label="Name of the category"
v-model="category.name" v-model="category.title"
:counter="100" :counter="100"
required required
></v-text-field> ></v-text-field>
<input type="file" @change="processFile($event.target)">
</v-form> </v-form>
<v-btn color="primary" @click="create">Create category</v-btn> <v-btn color="primary" @click="create">Create category</v-btn>
</div> </div>
@ -22,32 +21,20 @@
data() { data() {
return { return {
category: { category: {
name: '', title: '',
imageDataUri: null,
}, },
}; };
}, },
methods: { methods: {
create() { create() {
const router = this.$router; const router = this.$router;
eventFetch('/categories', this.$store, { method: 'POST', body: JSON.stringify(this.category) }) eventFetch('/categories', this.$store, { method: 'POST', body: JSON.stringify({ category: this.category }) })
.then(response => response.json()) .then(response => response.json())
.then(() => { .then(() => {
this.loading = false; this.loading = false;
router.push('/category') router.push('/category')
}); });
}, },
processFile(target) {
const reader = new FileReader();
const file = target.files[0];
reader.addEventListener('load', () => {
this.category.imageDataUri = reader.result;
});
if (file) {
reader.readAsDataURL(file);
}
}
}, },
}; };
</script> </script>

View File

@ -11,7 +11,7 @@
</v-card-media> </v-card-media>
<v-card-title primary-title> <v-card-title primary-title>
<div> <div>
<h3 class="headline mb-0">{{ category.name }}</h3> <h3 class="headline mb-0">{{ category.title }}</h3>
<div>{{ category.description }}</div> <div>{{ category.description }}</div>
</div> </div>
</v-card-title> </v-card-title>
@ -49,9 +49,9 @@
fetchData() { fetchData() {
eventFetch('/categories', this.$store) eventFetch('/categories', this.$store)
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((response) => {
this.loading = false; this.loading = false;
this.categories = data['hydra:member']; this.categories = response.data;
}); });
}, },
deleteCategory(categoryId) { deleteCategory(categoryId) {

View File

@ -36,7 +36,7 @@
<v-select <v-select
v-bind:items="categories" v-bind:items="categories"
v-model="event.category" v-model="event.category"
item-text="name" item-text="title"
item-value="@id" item-value="@id"
label="Categories" label="Categories"
single-line single-line
@ -62,7 +62,7 @@
<v-stepper-step step="2" :complete="e1 > 2">Date and place</v-stepper-step> <v-stepper-step step="2" :complete="e1 > 2">Date and place</v-stepper-step>
<v-stepper-content step="2"> <v-stepper-content step="2">
Event starts at: Event starts at:
<v-text-field type="datetime-local" v-model="event.startDate"></v-text-field> <v-text-field type="datetime-local" v-model="event.begins_on"></v-text-field>
<!--<v-layout row wrap> <!--<v-layout row wrap>
<v-flex md6> <v-flex md6>
<v-dialog <v-dialog
@ -113,7 +113,7 @@
</v-flex> </v-flex>
</v-layout>--> </v-layout>-->
Event ends at: Event ends at:
<v-text-field type="datetime-local" v-model="event.endDate"></v-text-field> <v-text-field type="datetime-local" v-model="event.ends_on"></v-text-field>
<!--<v-layout row wrap> <!--<v-layout row wrap>
<v-flex md6> <v-flex md6>
<v-dialog <v-dialog
@ -216,8 +216,8 @@
event: { event: {
title: '', title: '',
description: '', description: '',
startDate: new Date(), begins_on: new Date(),
endDate: new Date(), ends_on: new Date(),
seats: 0, seats: 0,
address: { address: {
description: null, description: null,
@ -261,12 +261,12 @@
// '@type': 'Tag', // '@type': 'Tag',
}); });
}); });
this.event.organizer = "/accounts/" + this.$store.state.user.account.id; this.event.organizer_id = this.$store.state.user.account.id;
this.event.participants = ["/accounts/" + this.$store.state.user.account.id]; this.event.participants = [this.$store.state.user.account.id];
this.event.price = parseFloat(this.event.price); this.event.price = parseFloat(this.event.price);
if (this.id === undefined) { if (this.id === undefined) {
eventFetch('/events', this.$store, {method: 'POST', body: JSON.stringify(this.event)}) eventFetch('/events', this.$store, {method: 'POST', body: JSON.stringify({ event: this.event })})
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((data) => {
this.loading = false; this.loading = false;
@ -284,17 +284,17 @@
fetchCategories() { fetchCategories() {
eventFetch('/categories', this.$store) eventFetch('/categories', this.$store)
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((response) => {
this.loading = false; this.loading = false;
this.categories = data['hydra:member']; this.categories = response.data;
}); });
}, },
fetchTags() { fetchTags() {
eventFetch('/tags', this.$store) eventFetch('/tags', this.$store)
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((response) => {
this.loading = false; this.loading = false;
data['hydra:member'].forEach((tag) => { response.data.forEach((tag) => {
this.tagsFetched.push(tag.name); this.tagsFetched.push(tag.name);
}); });
}); });

View File

@ -26,7 +26,7 @@
<div class="headline">{{ event.title }}</div> <div class="headline">{{ event.title }}</div>
</v-card-title> </v-card-title>
<v-container> <v-container>
<span class="grey--text">{{ event.startDate | formatDate }} à <router-link :to="{name: 'EventList', params: {location: geocode(event.address.geo.latitude, event.address.geo.longitude, 10) }}">{{ event.address.addressLocality }}</router-link></span><br> <!--<span class="grey&#45;&#45;text">{{ event.startDate | formatDate }} à <router-link :to="{name: 'EventList', params: {location: geocode(event.address.geo.latitude, event.address.geo.longitude, 10) }}">{{ event.address.addressLocality }}</router-link></span><br>-->
<p><vue-markdown>{{ event.description }}</vue-markdown></p> <p><vue-markdown>{{ event.description }}</vue-markdown></p>
<p v-if="event.organizer">Organisé par <router-link :to="{name: 'Account', params: {'id': event.organizer.id}}">{{ event.organizer.username }}</router-link></p> <p v-if="event.organizer">Organisé par <router-link :to="{name: 'Account', params: {'id': event.organizer.id}}">{{ event.organizer.username }}</router-link></p>
</v-container> </v-container>
@ -93,9 +93,9 @@
this.locationChip = true; this.locationChip = true;
eventFetch(queryString, this.$store) eventFetch(queryString, this.$store)
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((response) => {
this.loading = false; this.loading = false;
this.events = data['hydra:member']; this.events = response.data;
}); });
}, },
deleteEvent(id) { deleteEvent(id) {

View File

@ -98,7 +98,7 @@
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((data) => {
this.loading = false; this.loading = false;
this.categories = data['hydra:member']; this.categories = data;
}); });
}, },
getAddressData: function (addressData) { getAddressData: function (addressData) {

View File

@ -58,7 +58,7 @@
.then(response => response.json()) .then(response => response.json())
.then((data) => { .then((data) => {
this.loading = false; this.loading = false;
this.groups = data['hydra:member']; this.groups = data;
}); });
}, },
deleteEvent(id) { deleteEvent(id) {

View File

@ -1,6 +1,6 @@
<template> <template>
<v-container> <v-container>
<h1 class="welcome" v-if="$store.state.user">{{ $t("home.welcome", { 'username': $store.state.user.username}) }}</h1> <h1 class="welcome" v-if="$store.state.user">{{ $t("home.welcome", { 'username': this.displayed_name }) }}</h1>
<h1 class="welcome" v-else>{{ $t("home.welcome_off", { 'username': $store.state.user.username}) }}</h1> <h1 class="welcome" v-else>{{ $t("home.welcome_off", { 'username': $store.state.user.username}) }}</h1>
<router-link :to="{ name: 'EventList' }">{{ $t('home.events') }}</router-link> <router-link :to="{ name: 'EventList' }">{{ $t('home.events') }}</router-link>
<router-link v-if="$store.state.user === false" :to="{ name: 'Login' }">{{ $t('home.login') }}</router-link> <router-link v-if="$store.state.user === false" :to="{ name: 'Login' }">{{ $t('home.login') }}</router-link>
@ -48,12 +48,17 @@ export default {
mounted() { mounted() {
// this.fetchLocations(); // this.fetchLocations();
}, },
computed: {
displayed_name: function() {
return this.$store.state.user.account.display_name === null ? this.$store.state.user.account.username : this.$store.state.user.account.display_name
},
},
methods: { methods: {
fetchLocations() { fetchLocations() {
eventFetch('/locations', this.$store) eventFetch('/locations', this.$store)
.then((response) => (response.json())) .then((response) => (response.json()))
.then((response) => { .then((response) => {
this.locations = response['hydra:member']; this.locations = response;
}); });
}, },
geoLocalize() { geoLocalize() {

View File

@ -65,10 +65,19 @@
methods: { methods: {
loginAction(e) { loginAction(e) {
e.preventDefault(); e.preventDefault();
auth.login(JSON.stringify(this.credentials), this.$store, '/', (error) => { auth.login(JSON.stringify(this.credentials), (data) => {
this.$store.commit('LOGIN_USER', data.user);
this.$router.push({ name: 'Home' });
}, (error) => {
Promise.resolve(error).then((errorMsg) => {
console.log(errorMsg);
this.error.show = true; this.error.show = true;
this.error.text = error.message; this.error.text = this.$t(errorMsg.display_error);
this.error.field[error.field] = true; }).catch((e) => {
console.log(e);
this.error.show = true;
this.error.text = e.message;
});
}); });
}, },
}, },

View File

@ -58,7 +58,7 @@
</v-card-actions> </v-card-actions>
</v-card> </v-card>
</v-menu> </v-menu>
<v-btn flat @click="$router.push({name: 'Account', params: {'id': getUser().account.id}})" v-if="$store.state.isLogged && getUser()">{{ getUser().username }}</v-btn> <v-btn flat @click="$router.push({name: 'Account', params: {'id': getUser().account.id}})" v-if="$store.state.user">{{ this.displayed_name }}</v-btn>
</v-toolbar> </v-toolbar>
</template> </template>
@ -95,6 +95,11 @@
} }
} }
}, },
computed: {
displayed_name: function() {
return this.$store.state.user.account.display_name === null ? this.$store.state.user.account.username : this.$store.state.user.account.display_name
},
},
methods: { methods: {
getUser() { getUser() {
return this.$store.state.user === undefined ? false : this.$store.state.user; return this.$store.state.user === undefined ? false : this.$store.state.user;

View File

@ -72,7 +72,11 @@
methods: { methods: {
registerAction(e) { registerAction(e) {
e.preventDefault(); e.preventDefault();
auth.signup(JSON.stringify(this.credentials), this.$store, {name: 'Home'}, (error) => { auth.signup(JSON.stringify(this.credentials), (response) => {
console.log(response);
this.$store.commit('LOGIN_USER', response.user);
this.$router.push({ name: 'Home' });
}, (error) => {
this.error.show = true; this.error.show = true;
this.error.text = error.message; this.error.text = error.message;
this.error.field[error.field] = true; this.error.field[error.field] = true;

View File

@ -12,4 +12,9 @@ export default {
title: "Votre liste d'événements", title: "Votre liste d'événements",
}, },
}, },
session: {
error: {
bad_login: 'Erreur lors de la connexion : Votre nom d\'utilisateur ou votre mot de passe est incorrect',
},
},
}; };

View File

@ -10,8 +10,9 @@ import VuexI18n from 'vuex-i18n';
import 'vuetify/dist/vuetify.min.css'; import 'vuetify/dist/vuetify.min.css';
import App from '@/App'; import App from '@/App';
import router from '@/router'; import router from '@/router';
import storeData from './store/index'; import storeData from '@/store/index';
import translations from './i18n/index'; import translations from '@/i18n/index';
import auth from '@/auth';
Vue.config.productionTip = false; Vue.config.productionTip = false;
@ -46,6 +47,19 @@ Object.entries(translations).forEach((key) => {
Vue.i18n.set(language); Vue.i18n.set(language);
Vue.i18n.fallback('en'); Vue.i18n.fallback('en');
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiredAuth) && store.state.user === undefined || store.state.user == null) {
next({
name: 'Login',
query: { redirect: to.fullPath }
});
} else {
next();
}
});
auth.getUser(store, () => {}, () => {});
/* eslint-disable no-new */ /* eslint-disable no-new */
new Vue({ new Vue({
el: '#app', el: '#app',

View File

@ -14,7 +14,6 @@ import Account from '@/components/Account/Account';
import CreateGroup from '@/components/Group/Create'; import CreateGroup from '@/components/Group/Create';
import Group from '@/components/Group/Group'; import Group from '@/components/Group/Group';
import GroupList from '@/components/Group/GroupList'; import GroupList from '@/components/Group/GroupList';
import Auth from '@/auth/index';
Vue.use(Router); Vue.use(Router);
@ -118,16 +117,4 @@ const router = new Router({
], ],
}); });
router.beforeEach((to, from, next) => {
if (to.matched.some(record => record.meta.requiredAuth) && !Auth.checkAuth()) {
console.log('needs login');
next({
path: '/',
query: { redirect: to.fullPath }
});
} else {
next();
}
});
export default router; export default router;

View File

@ -1,21 +1,26 @@
import { LOGIN_USER, LOGOUT_USER, SAVE_USER } from './mutation-types'; import { LOGIN_USER, LOGOUT_USER, LOAD_USER } from './mutation-types';
const state = { const state = {
isLogged: !!localStorage.getItem('token'), isLogged: !!localStorage.getItem('token'),
user: false, user: false,
}; };
/* eslint-disable */
const mutations = { const mutations = {
[LOGIN_USER](state) { [LOGIN_USER](state, user) {
state.isLogged = true; state.isLogged = true;
state.user = user;
},
[LOAD_USER](state, user) {
state.user = user;
}, },
[LOGOUT_USER](state) { [LOGOUT_USER](state) {
state.isLogged = false; state.isLogged = false;
}, state.user = null;
[SAVE_USER](state, user) {
state.user = user;
}, },
}; };
/* eslint-enable */
export default { state, mutations }; export default { state, mutations };

View File

@ -1,3 +1,3 @@
export const LOGIN_USER = 'LOGIN_USER'; export const LOGIN_USER = 'LOGIN_USER';
export const LOAD_USER = 'LOAD_USER';
export const LOGOUT_USER = 'LOGOUT_USER'; export const LOGOUT_USER = 'LOGOUT_USER';
export const SAVE_USER = 'SAVE_USER';

View File

@ -1,22 +1,23 @@
defmodule Eventos.Accounts.Account do defmodule Eventos.Accounts.Account do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Accounts.{Account, GroupAccount, GroupRequest, Group, User} alias Eventos.Accounts.{Account, User}
alias Eventos.Groups.{Group, Member, Request}
alias Eventos.Events.Event alias Eventos.Events.Event
schema "accounts" do schema "accounts" do
field :username, :string
field :description, :string field :description, :string
field :display_name, :string field :display_name, :string
field :domain, :string, default: nil field :domain, :string
field :private_key, :string field :private_key, :string
field :public_key, :string field :public_key, :string
field :suspended, :boolean, default: false field :suspended, :boolean, default: false
field :uri, :string field :uri, :string
field :url, :string field :url, :string
has_many :organized_events, Event field :username, :string
many_to_many :groups, Group, join_through: GroupAccount has_many :organized_events, Event, [foreign_key: :organizer_id]
has_many :group_request, GroupRequest many_to_many :groups, Group, join_through: Member
has_many :group_request, Request
has_one :user, User has_one :user, User
timestamps() timestamps()
@ -26,7 +27,14 @@ defmodule Eventos.Accounts.Account do
def changeset(%Account{} = account, attrs) do def changeset(%Account{} = account, attrs) do
account account
|> cast(attrs, [:username, :domain, :display_name, :description, :private_key, :public_key, :suspended, :uri, :url]) |> cast(attrs, [:username, :domain, :display_name, :description, :private_key, :public_key, :suspended, :uri, :url])
|> validate_required([:username, :display_name, :description, :private_key, :public_key, :suspended]) |> validate_required([:username, :public_key, :suspended, :uri, :url])
|> unique_constraint(:username, name: :accounts_username_domain_index) |> unique_constraint(:username, name: :accounts_username_domain_index)
end end
def registration_changeset(%Account{} = account, attrs) do
account
|> cast(attrs, [:username, :domain, :display_name, :description, :private_key, :public_key, :suspended, :uri, :url])
|> validate_required([:username, :public_key, :suspended, :uri, :url])
|> unique_constraint(:username)
end
end end

View File

@ -4,130 +4,8 @@ defmodule Eventos.Accounts do
""" """
import Ecto.Query, warn: false import Ecto.Query, warn: false
import Logger
alias Eventos.Repo alias Eventos.Repo
import Logger
alias Eventos.Accounts.User
@doc """
Returns the list of users.
## Examples
iex> list_users()
[%User{}, ...]
"""
def list_users do
Repo.all(User)
end
@doc """
Gets a single user.
Raises `Ecto.NoResultsError` if the User does not exist.
## Examples
iex> get_user!(123)
%User{}
iex> get_user!(456)
** (Ecto.NoResultsError)
"""
def get_user!(id), do: Repo.get!(User, id)
@doc """
Get an user by email
"""
def find(email) do
Repo.get_by!(User, email: email)
end
@doc """
Authenticate user
"""
def authenticate(%{user: user, password: password}) do
# Does password match the one stored in the database?
Logger.debug(user.password_hash)
Logger.debug(password)
case Comeonin.Argon2.checkpw(password, user.password_hash) do
true ->
# Yes, create and return the token
EventosWeb.Guardian.encode_and_sign(user)
_ ->
# No, return an error
{:error, :unauthorized}
end
end
@doc """
Creates a user.
## Examples
iex> create_user(%{field: value})
{:ok, %User{}}
iex> create_user(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_user(attrs \\ %{}) do
%User{}
|> User.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a user.
## Examples
iex> update_user(user, %{field: new_value})
{:ok, %User{}}
iex> update_user(user, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_user(%User{} = user, attrs) do
user
|> User.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a User.
## Examples
iex> delete_user(user)
{:ok, %User{}}
iex> delete_user(user)
{:error, %Ecto.Changeset{}}
"""
def delete_user(%User{} = user) do
Repo.delete(user)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking user changes.
## Examples
iex> change_user(user)
%Ecto.Changeset{source: %User{}}
"""
def change_user(%User{} = user) do
User.changeset(user, %{})
end
alias Eventos.Accounts.Account alias Eventos.Accounts.Account
@ -158,7 +36,14 @@ defmodule Eventos.Accounts do
** (Ecto.NoResultsError) ** (Ecto.NoResultsError)
""" """
def get_account!(id), do: Repo.get!(Account, id) def get_account!(id) do
account = Repo.get!(Account, id)
end
def get_account_with_everything!(id) do
account = Repo.get!(Account, id)
|> Repo.preload :organized_events
end
@doc """ @doc """
Creates a account. Creates a account.
@ -225,291 +110,177 @@ defmodule Eventos.Accounts do
Account.changeset(account, %{}) Account.changeset(account, %{})
end end
alias Eventos.Accounts.Group alias Eventos.Accounts.User
@doc """ @doc """
Returns the list of groups. Returns the list of users.
## Examples ## Examples
iex> list_groups() iex> list_users()
[%Group{}, ...] [%User{}, ...]
""" """
def list_groups do def list_users do
Repo.all(Group) Repo.all(User)
end
def list_users_with_accounts do
Repo.all(User)
|> Repo.preload :account
end end
@doc """ @doc """
Gets a single group. Gets a single user.
Raises `Ecto.NoResultsError` if the Group does not exist. Raises `Ecto.NoResultsError` if the User does not exist.
## Examples ## Examples
iex> get_group!(123) iex> get_user!(123)
%Group{} %User{}
iex> get_group!(456) iex> get_user!(456)
** (Ecto.NoResultsError) ** (Ecto.NoResultsError)
""" """
def get_group!(id), do: Repo.get!(Group, id) def get_user!(id), do: Repo.get!(User, id)
def get_user_with_account!(id) do
Repo.get!(User, id)
|> Repo.preload :account
end
@doc """ @doc """
Creates a group. Get an user by email
"""
def find_by_email(email) do
user = Repo.get_by(User, email: email)
|> Repo.preload :account
end
@doc """
Authenticate user
"""
def authenticate(%{user: user, password: password}) do
# Does password match the one stored in the database?
case Comeonin.Argon2.checkpw(password, user.password_hash) do
true ->
# Yes, create and return the token
EventosWeb.Guardian.encode_and_sign(user)
_ ->
# No, return an error
{:error, :unauthorized}
end
end
@doc """
Register user
"""
def register(%{email: email, password: password, username: username}) do
{:ok, {privkey, pubkey}} = RsaEx.generate_keypair("4096")
account = Eventos.Accounts.Account.registration_changeset(%Eventos.Accounts.Account{}, %{
username: username,
domain: nil,
private_key: privkey,
public_key: pubkey,
uri: "h",
url: "h"
})
user = Eventos.Accounts.User.registration_changeset(%Eventos.Accounts.User{}, %{
email: email,
password: password
})
account_with_user = Ecto.Changeset.put_assoc(account, :user, user)
try do
coucou = Eventos.Repo.insert!(account_with_user)
user = find_by_email(email)
{:ok, user}
rescue
e in Ecto.InvalidChangesetError ->
Logger.debug(inspect e)
{:error, e.changeset.changes.user.errors}
end
# with {:ok, %Account{} = account} <- create_account(%{username: username, suspended: false, domain: nil, private_key: privkey, public_key: pubkey, uri: "h", url: "h"}) do
# case create_user(%{email: email, password: password, account: account}) do
# {:ok, %User{} = user } ->
# {:ok, user}
# {:error, %Ecto.Changeset{} = changeset} ->
# {:error, changeset}
# end
# end
end
@doc """
Creates a user.
## Examples ## Examples
iex> create_group(%{field: value}) iex> create_user(%{field: value})
{:ok, %Group{}} {:ok, %User{}}
iex> create_group(%{field: bad_value}) iex> create_user(%{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def create_group(attrs \\ %{}) do def create_user(attrs \\ %{}) do
%Group{} %User{}
|> Group.changeset(attrs) |> User.registration_changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
@doc """ @doc """
Updates a group. Updates a user.
## Examples ## Examples
iex> update_group(group, %{field: new_value}) iex> update_user(user, %{field: new_value})
{:ok, %Group{}} {:ok, %User{}}
iex> update_group(group, %{field: bad_value}) iex> update_user(user, %{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def update_group(%Group{} = group, attrs) do def update_user(%User{} = user, attrs) do
group user
|> Group.changeset(attrs) |> User.changeset(attrs)
|> Repo.update() |> Repo.update()
end end
@doc """ @doc """
Deletes a Group. Deletes a User.
## Examples ## Examples
iex> delete_group(group) iex> delete_user(user)
{:ok, %Group{}} {:ok, %User{}}
iex> delete_group(group) iex> delete_user(user)
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def delete_group(%Group{} = group) do def delete_user(%User{} = user) do
Repo.delete(group) Repo.delete(user)
end end
@doc """ @doc """
Returns an `%Ecto.Changeset{}` for tracking group changes. Returns an `%Ecto.Changeset{}` for tracking user changes.
## Examples ## Examples
iex> change_group(group) iex> change_user(user)
%Ecto.Changeset{source: %Group{}} %Ecto.Changeset{source: %User{}}
""" """
def change_group(%Group{} = group) do def change_user(%User{} = user) do
Group.changeset(group, %{}) User.changeset(user, %{})
end
alias Eventos.Accounts.GroupAccount
@doc """
Returns the list of group_accounts.
## Examples
iex> list_group_accounts()
[%GroupAccount{}, ...]
"""
def list_group_accounts do
Repo.all(GroupAccount)
end
@doc """
Gets a single group_account.
Raises `Ecto.NoResultsError` if the Group account does not exist.
## Examples
iex> get_group_account!(123)
%GroupAccount{}
iex> get_group_account!(456)
** (Ecto.NoResultsError)
"""
def get_group_account!(id), do: Repo.get!(GroupAccount, id)
@doc """
Creates a group_account.
## Examples
iex> create_group_account(%{field: value})
{:ok, %GroupAccount{}}
iex> create_group_account(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_group_account(attrs \\ %{}) do
%GroupAccount{}
|> GroupAccount.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a group_account.
## Examples
iex> update_group_account(group_account, %{field: new_value})
{:ok, %GroupAccount{}}
iex> update_group_account(group_account, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_group_account(%GroupAccount{} = group_account, attrs) do
group_account
|> GroupAccount.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a GroupAccount.
## Examples
iex> delete_group_account(group_account)
{:ok, %GroupAccount{}}
iex> delete_group_account(group_account)
{:error, %Ecto.Changeset{}}
"""
def delete_group_account(%GroupAccount{} = group_account) do
Repo.delete(group_account)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking group_account changes.
## Examples
iex> change_group_account(group_account)
%Ecto.Changeset{source: %GroupAccount{}}
"""
def change_group_account(%GroupAccount{} = group_account) do
GroupAccount.changeset(group_account, %{})
end
alias Eventos.Accounts.GroupRequest
@doc """
Returns the list of group_request.
## Examples
iex> list_group_requests()
[%GroupRequest{}, ...]
"""
def list_group_requests do
Repo.all(GroupRequest)
end
@doc """
Gets a single group_request.
Raises `Ecto.NoResultsError` if the Group request does not exist.
## Examples
iex> get_group_request!(123)
%GroupRequest{}
iex> get_group_request!(456)
** (Ecto.NoResultsError)
"""
def get_group_request!(id), do: Repo.get!(GroupRequest, id)
@doc """
Creates a group_request.
## Examples
iex> create_group_request(%{field: value})
{:ok, %GroupRequest{}}
iex> create_group_request(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_group_request(attrs \\ %{}) do
%GroupRequest{}
|> GroupRequest.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a group_request.
## Examples
iex> update_group_request(group_request, %{field: new_value})
{:ok, %GroupRequest{}}
iex> update_group_request(group_request, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_group_request(%GroupRequest{} = group_request, attrs) do
group_request
|> GroupRequest.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a GroupRequest.
## Examples
iex> delete_group_request(group_request)
{:ok, %GroupRequest{}}
iex> delete_group_request(group_request)
{:error, %Ecto.Changeset{}}
"""
def delete_group_request(%GroupRequest{} = group_request) do
Repo.delete(group_request)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking group_request changes.
## Examples
iex> change_group_request(group_request)
%Ecto.Changeset{source: %GroupRequest{}}
"""
def change_group_request(%GroupRequest{} = group_request) do
GroupRequest.changeset(group_request, %{})
end end
end end

View File

@ -1,25 +0,0 @@
defmodule Eventos.Accounts.Group do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Accounts.{Group, Account, GroupAccount, GroupRequest}
schema "groups" do
field :description, :string
field :suspended, :boolean, default: false
field :title, :string
field :uri, :string
field :url, :string
many_to_many :accounts, Account, join_through: GroupAccount
has_many :requests, GroupRequest
timestamps()
end
@doc false
def changeset(%Group{} = group, attrs) do
group
|> cast(attrs, [:title, :description, :suspended, :url, :uri])
|> validate_required([:title, :description, :suspended, :url, :uri])
end
end

View File

@ -2,24 +2,22 @@ defmodule Eventos.Accounts.User do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Accounts.{Account, User} alias Eventos.Accounts.{Account, User}
alias Eventos.Repo
import Logger
schema "users" do schema "users" do
field :email, :string field :email, :string
field :role, :integer, default: 0
field :password, :string, virtual: true
field :password_hash, :string field :password_hash, :string
field :password, :string, virtual: true
field :role, :integer, default: 0
belongs_to :account, Account belongs_to :account, Account
timestamps() timestamps()
end end
@doc false @doc false
def changeset(%User{} = user, attrs) do def changeset(%User{} = user, attrs) do
user user
|> cast(attrs, [:email, :password_hash]) |> cast(attrs, [:email, :role, :password_hash, :account_id])
|> validate_required([:email]) |> validate_required([:email])
|> unique_constraint(:email) |> unique_constraint(:email)
|> validate_format(:email, ~r/@/) |> validate_format(:email, ~r/@/)
@ -44,4 +42,5 @@ defmodule Eventos.Accounts.User do
changeset changeset
end end
end end
end end

View File

@ -14,6 +14,7 @@ defmodule Eventos.Application do
supervisor(EventosWeb.Endpoint, []), supervisor(EventosWeb.Endpoint, []),
# Start your own worker by calling: Eventos.Worker.start_link(arg1, arg2, arg3) # Start your own worker by calling: Eventos.Worker.start_link(arg1, arg2, arg3)
# worker(Eventos.Worker, [arg1, arg2, arg3]), # worker(Eventos.Worker, [arg1, arg2, arg3]),
worker(Guardian.DB.Token.SweeperServer, [])
] ]
# See https://hexdocs.pm/elixir/Supervisor.html # See https://hexdocs.pm/elixir/Supervisor.html

View File

@ -5,8 +5,9 @@ defmodule Eventos.Events.Category do
schema "categories" do schema "categories" do
field :description, :string
field :picture, :string field :picture, :string
field :title, :string field :title, :string, null: false
timestamps() timestamps()
end end
@ -14,8 +15,8 @@ defmodule Eventos.Events.Category do
@doc false @doc false
def changeset(%Category{} = category, attrs) do def changeset(%Category{} = category, attrs) do
category category
|> cast(attrs, [:title, :picture]) |> cast(attrs, [:title, :description, :picture])
|> validate_required([:title, :picture]) |> validate_required([:title])
|> unique_constraint(:title) |> unique_constraint(:title)
end end
end end

View File

@ -1,18 +1,65 @@
defmodule Eventos.Events.Event.TitleSlug do
alias Eventos.Events.Event
import Ecto.Query
alias Eventos.Repo
use EctoAutoslugField.Slug, from: :title, to: :slug
def build_slug(sources, changeset) do
slug = super(sources, changeset)
build_unique_slug(slug, changeset)
end
defp build_unique_slug(slug, changeset) do
query = from e in Event,
where: e.slug == ^slug
case Repo.one(query) do
nil -> slug
_event ->
slug
|> increment_slug
|> build_unique_slug(changeset)
end
end
defp increment_slug(slug) do
case List.pop_at(String.split(slug, "-"), -1) do
{nil, _} ->
slug
{suffix, slug_parts} ->
case Integer.parse(suffix) do
{id, _} -> Enum.join(slug_parts, "-") <> "-" <> Integer.to_string(id + 1)
:error -> slug <> "-1"
end
end
end
end
defmodule Eventos.Events.Event do defmodule Eventos.Events.Event do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Events.{Event, EventAccount, EventRequest} alias Eventos.Events.{Event, Participant, Request, Tag, Session, Track}
alias Eventos.Events.Event.TitleSlug
alias Eventos.Accounts.Account alias Eventos.Accounts.Account
schema "events" do schema "events" do
field :begin_on, :utc_datetime field :begins_on, Timex.Ecto.DateTimeWithTimezone
field :description, :string field :description, :string
field :ends_on, :utc_datetime field :ends_on, Timex.Ecto.DateTimeWithTimezone
field :title, :string field :title, :string
has_one :organizer_id, Account field :geom, Geo.Geometry
many_to_many :participants, Account, join_through: EventAccount field :slug, TitleSlug.Type
has_many :event_request, EventRequest field :state, :integer, default: 0
field :public, :boolean, default: true
field :thumbnail, :string
field :large_image, :string
field :publish_at, Timex.Ecto.DateTimeWithTimezone
belongs_to :organizer, Account, [foreign_key: :organizer_id]
has_many :tags, Tag
many_to_many :participants, Account, join_through: Participant
has_many :event_request, Request
has_many :tracks, Track
has_many :sessions, Session
timestamps() timestamps()
end end
@ -20,7 +67,9 @@ defmodule Eventos.Events.Event do
@doc false @doc false
def changeset(%Event{} = event, attrs) do def changeset(%Event{} = event, attrs) do
event event
|> cast(attrs, [:title, :description, :begin_on, :ends_on]) |> cast(attrs, [:title, :description, :begins_on, :ends_on, :organizer_id])
|> validate_required([:title, :description, :begin_on, :ends_on, :organizer_id]) |> validate_required([:title, :description, :begins_on, :ends_on, :organizer_id])
|> TitleSlug.maybe_generate_slug()
|> TitleSlug.unique_constraint()
end end
end end

View File

@ -1,22 +0,0 @@
defmodule Eventos.Events.EventAccounts do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Events.{EventAccounts, Event}
alias Eventos.Accounts.Account
@primary_key false
schema "event_accounts" do
field :roles, :integer
belongs_to :event, Event
belongs_to :account, Account
timestamps()
end
@doc false
def changeset(%EventAccounts{} = event_accounts, attrs) do
event_accounts
|> cast(attrs, [:roles])
|> validate_required([:roles])
end
end

View File

@ -7,6 +7,7 @@ defmodule Eventos.Events do
alias Eventos.Repo alias Eventos.Repo
alias Eventos.Events.Event alias Eventos.Events.Event
alias Eventos.Accounts.Account
@doc """ @doc """
Returns the list of events. Returns the list of events.
@ -294,195 +295,389 @@ defmodule Eventos.Events do
Tag.changeset(tag, %{}) Tag.changeset(tag, %{})
end end
alias Eventos.Events.EventAccounts alias Eventos.Events.Participant
@doc """ @doc """
Returns the list of event_accounts. Returns the list of participants.
## Examples ## Examples
iex> list_event_accounts() iex> list_participants()
[%EventAccounts{}, ...] [%Participant{}, ...]
""" """
def list_event_accounts do def list_participants do
Repo.all(EventAccounts) Repo.all(Participant)
end end
@doc """ @doc """
Gets a single event_accounts. Gets a single participant.
Raises `Ecto.NoResultsError` if the Event accounts does not exist. Raises `Ecto.NoResultsError` if the Participant does not exist.
## Examples ## Examples
iex> get_event_accounts!(123) iex> get_participant!(123)
%EventAccounts{} %Participant{}
iex> get_event_accounts!(456) iex> get_participant!(456)
** (Ecto.NoResultsError) ** (Ecto.NoResultsError)
""" """
def get_event_accounts!(id), do: Repo.get!(EventAccounts, id) def get_participant!(event_id, account_id) do
Repo.get_by!(Participant, [event_id: event_id, account_id: account_id])
end
@doc """ @doc """
Creates a event_accounts. Creates a participant.
## Examples ## Examples
iex> create_event_accounts(%{field: value}) iex> create_participant(%{field: value})
{:ok, %EventAccounts{}} {:ok, %Participant{}}
iex> create_event_accounts(%{field: bad_value}) iex> create_participant(%{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def create_event_accounts(attrs \\ %{}) do def create_participant(attrs \\ %{}) do
%EventAccounts{} %Participant{}
|> EventAccounts.changeset(attrs) |> Participant.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
@doc """ @doc """
Updates a event_accounts. Updates a participant.
## Examples ## Examples
iex> update_event_accounts(event_accounts, %{field: new_value}) iex> update_participant(participant, %{field: new_value})
{:ok, %EventAccounts{}} {:ok, %Participant{}}
iex> update_event_accounts(event_accounts, %{field: bad_value}) iex> update_participant(participant, %{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def update_event_accounts(%EventAccounts{} = event_accounts, attrs) do def update_participant(%Participant{} = participant, attrs) do
event_accounts participant
|> EventAccounts.changeset(attrs) |> Participant.changeset(attrs)
|> Repo.update() |> Repo.update()
end end
@doc """ @doc """
Deletes a EventAccounts. Deletes a Participant.
## Examples ## Examples
iex> delete_event_accounts(event_accounts) iex> delete_participant(participant)
{:ok, %EventAccounts{}} {:ok, %Participant{}}
iex> delete_event_accounts(event_accounts) iex> delete_participant(participant)
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def delete_event_accounts(%EventAccounts{} = event_accounts) do def delete_participant(%Participant{} = participant) do
Repo.delete(event_accounts) Repo.delete(participant)
end end
@doc """ @doc """
Returns an `%Ecto.Changeset{}` for tracking event_accounts changes. Returns an `%Ecto.Changeset{}` for tracking participant changes.
## Examples ## Examples
iex> change_event_accounts(event_accounts) iex> change_participant(participant)
%Ecto.Changeset{source: %EventAccounts{}} %Ecto.Changeset{source: %Participant{}}
""" """
def change_event_accounts(%EventAccounts{} = event_accounts) do def change_participant(%Participant{} = participant) do
EventAccounts.changeset(event_accounts, %{}) Participant.changeset(participant, %{})
end end
alias Eventos.Events.EventRequest alias Eventos.Events.Request
@doc """ @doc """
Returns the list of event_requests. Returns the list of requests.
## Examples ## Examples
iex> list_event_requests() iex> list_requests()
[%EventRequest{}, ...] [%Request{}, ...]
""" """
def list_event_requests do def list_requests do
Repo.all(EventRequest) Repo.all(Request)
end end
@doc """ @doc """
Gets a single event_request. Gets a single request.
Raises `Ecto.NoResultsError` if the Event request does not exist. Raises `Ecto.NoResultsError` if the Request does not exist.
## Examples ## Examples
iex> get_event_request!(123) iex> get_request!(123)
%EventRequest{} %Request{}
iex> get_event_request!(456) iex> get_request!(456)
** (Ecto.NoResultsError) ** (Ecto.NoResultsError)
""" """
def get_event_request!(id), do: Repo.get!(EventRequest, id) def get_request!(id), do: Repo.get!(Request, id)
@doc """ @doc """
Creates a event_request. Creates a request.
## Examples ## Examples
iex> create_event_request(%{field: value}) iex> create_request(%{field: value})
{:ok, %EventRequest{}} {:ok, %Request{}}
iex> create_event_request(%{field: bad_value}) iex> create_request(%{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def create_event_request(attrs \\ %{}) do def create_request(attrs \\ %{}) do
%EventRequest{} %Request{}
|> EventRequest.changeset(attrs) |> Request.changeset(attrs)
|> Repo.insert() |> Repo.insert()
end end
@doc """ @doc """
Updates a event_request. Updates a request.
## Examples ## Examples
iex> update_event_request(event_request, %{field: new_value}) iex> update_request(request, %{field: new_value})
{:ok, %EventRequest{}} {:ok, %Request{}}
iex> update_event_request(event_request, %{field: bad_value}) iex> update_request(request, %{field: bad_value})
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def update_event_request(%EventRequest{} = event_request, attrs) do def update_request(%Request{} = request, attrs) do
event_request request
|> EventRequest.changeset(attrs) |> Request.changeset(attrs)
|> Repo.update() |> Repo.update()
end end
@doc """ @doc """
Deletes a EventRequest. Deletes a Request.
## Examples ## Examples
iex> delete_event_request(event_request) iex> delete_request(request)
{:ok, %EventRequest{}} {:ok, %Request{}}
iex> delete_event_request(event_request) iex> delete_request(request)
{:error, %Ecto.Changeset{}} {:error, %Ecto.Changeset{}}
""" """
def delete_event_request(%EventRequest{} = event_request) do def delete_request(%Request{} = request) do
Repo.delete(event_request) Repo.delete(request)
end end
@doc """ @doc """
Returns an `%Ecto.Changeset{}` for tracking event_request changes. Returns an `%Ecto.Changeset{}` for tracking request changes.
## Examples ## Examples
iex> change_event_request(event_request) iex> change_request(request)
%Ecto.Changeset{source: %EventRequest{}} %Ecto.Changeset{source: %Request{}}
""" """
def change_event_request(%EventRequest{} = event_request) do def change_request(%Request{} = request) do
EventRequest.changeset(event_request, %{}) Request.changeset(request, %{})
end
alias Eventos.Events.Session
@doc """
Returns the list of sessions.
## Examples
iex> list_sessions()
[%Session{}, ...]
"""
def list_sessions do
Repo.all(Session)
end
@doc """
Gets a single session.
Raises `Ecto.NoResultsError` if the Session does not exist.
## Examples
iex> get_session!(123)
%Session{}
iex> get_session!(456)
** (Ecto.NoResultsError)
"""
def get_session!(id), do: Repo.get!(Session, id)
@doc """
Creates a session.
## Examples
iex> create_session(%{field: value})
{:ok, %Session{}}
iex> create_session(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_session(attrs \\ %{}) do
%Session{}
|> Session.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a session.
## Examples
iex> update_session(session, %{field: new_value})
{:ok, %Session{}}
iex> update_session(session, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_session(%Session{} = session, attrs) do
session
|> Session.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Session.
## Examples
iex> delete_session(session)
{:ok, %Session{}}
iex> delete_session(session)
{:error, %Ecto.Changeset{}}
"""
def delete_session(%Session{} = session) do
Repo.delete(session)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking session changes.
## Examples
iex> change_session(session)
%Ecto.Changeset{source: %Session{}}
"""
def change_session(%Session{} = session) do
Session.changeset(session, %{})
end
alias Eventos.Events.Track
@doc """
Returns the list of tracks.
## Examples
iex> list_tracks()
[%Track{}, ...]
"""
def list_tracks do
Repo.all(Track)
end
@doc """
Gets a single track.
Raises `Ecto.NoResultsError` if the Track does not exist.
## Examples
iex> get_track!(123)
%Track{}
iex> get_track!(456)
** (Ecto.NoResultsError)
"""
def get_track!(id), do: Repo.get!(Track, id)
@doc """
Creates a track.
## Examples
iex> create_track(%{field: value})
{:ok, %Track{}}
iex> create_track(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_track(attrs \\ %{}) do
%Track{}
|> Track.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a track.
## Examples
iex> update_track(track, %{field: new_value})
{:ok, %Track{}}
iex> update_track(track, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_track(%Track{} = track, attrs) do
track
|> Track.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Track.
## Examples
iex> delete_track(track)
{:ok, %Track{}}
iex> delete_track(track)
{:error, %Ecto.Changeset{}}
"""
def delete_track(%Track{} = track) do
Repo.delete(track)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking track changes.
## Examples
iex> change_track(track)
%Ecto.Changeset{source: %Track{}}
"""
def change_track(%Track{} = track) do
Track.changeset(track, %{})
end end
end end

View File

@ -0,0 +1,22 @@
defmodule Eventos.Events.Participant do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Events.{Participant, Event}
alias Eventos.Accounts.Account
@primary_key false
schema "participants" do
field :role, :integer
belongs_to :event, Event, primary_key: true
belongs_to :account, Account, primary_key: true
timestamps()
end
@doc false
def changeset(%Participant{} = participant, attrs) do
participant
|> cast(attrs, [:role, :event_id, :account_id])
|> validate_required([:role, :event_id, :account_id])
end
end

View File

@ -1,21 +1,20 @@
defmodule Eventos.Events.EventRequest do defmodule Eventos.Events.Request do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Events.{EventRequest, Event} alias Eventos.Events.{Request, Event}
alias Eventos.Accounts.Account alias Eventos.Accounts.Account
schema "event_requests" do schema "event_requests" do
field :state, :integer field :state, :integer
has_one :event_id, Event belongs_to :event, Event
has_one :account_id, Account belongs_to :account, Account
timestamps() timestamps()
end end
@doc false @doc false
def changeset(%EventRequest{} = event_request, attrs) do def changeset(%Request{} = request, attrs) do
event_request request
|> cast(attrs, [:state]) |> cast(attrs, [:state])
|> validate_required([:state]) |> validate_required([:state])
end end

View File

@ -0,0 +1,30 @@
defmodule Eventos.Events.Session do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Events.{Session, Event, Track}
schema "sessions" do
field :audios_urls, :string
field :language, :string
field :long_abstract, :string
field :short_abstract, :string
field :slides_url, :string
field :subtitle, :string
field :title, :string
field :videos_urls, :string
field :begins_on, Timex.Ecto.DateTimeWithTimezone
field :ends_on, Timex.Ecto.DateTimeWithTimezone
belongs_to :event, Event
belongs_to :track, Track
timestamps()
end
@doc false
def changeset(%Session{} = session, attrs) do
session
|> cast(attrs, [:title, :subtitle, :short_abstract, :long_abstract, :language, :slides_url, :videos_urls, :audios_urls, :event_id, :track_id])
|> validate_required([:title, :subtitle, :short_abstract, :long_abstract, :language, :slides_url, :videos_urls, :audios_urls])
end
end

View File

@ -1,12 +1,49 @@
defmodule Eventos.Events.Tag.TitleSlug do
alias Eventos.Events.Tag
import Ecto.Query
alias Eventos.Repo
use EctoAutoslugField.Slug, from: :title, to: :slug
def build_slug(sources, changeset) do
slug = super(sources, changeset)
build_unique_slug(slug, changeset)
end
defp build_unique_slug(slug, changeset) do
query = from t in Tag,
where: t.slug == ^slug
case Repo.one(query) do
nil -> slug
_story ->
slug
|> increment_slug
|> build_unique_slug(changeset)
end
end
defp increment_slug(slug) do
case List.pop_at(String.split(slug, "-"), -1) do
{nil, _} ->
slug
{suffix, slug_parts} ->
case Integer.parse(suffix) do
{id, _} -> Enum.join(slug_parts, "-") <> "-" <> Integer.to_string(id + 1)
:error -> slug <> "-1"
end
end
end
end
defmodule Eventos.Events.Tag do defmodule Eventos.Events.Tag do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Events.Tag alias Eventos.Events.Tag
alias Eventos.Events.Tag.TitleSlug
schema "tags" do schema "tags" do
field :slug, :string
field :title, :string field :title, :string
field :slug, TitleSlug.Type
timestamps() timestamps()
end end
@ -14,8 +51,9 @@ defmodule Eventos.Events.Tag do
@doc false @doc false
def changeset(%Tag{} = tag, attrs) do def changeset(%Tag{} = tag, attrs) do
tag tag
|> cast(attrs, [:title, :slug]) |> cast(attrs, [:title])
|> validate_required([:title, :slug]) |> validate_required([:title])
|> unique_constraint(:slug) |> TitleSlug.maybe_generate_slug()
|> TitleSlug.unique_constraint()
end end
end end

View File

@ -0,0 +1,23 @@
defmodule Eventos.Events.Track do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Events.{Track, Event, Session}
schema "tracks" do
field :color, :string
field :description, :string
field :name, :string
belongs_to :event, Event
has_many :sessions, Session
timestamps()
end
@doc false
def changeset(%Track{} = track, attrs) do
track
|> cast(attrs, [:name, :description, :color, :event_id])
|> validate_required([:name, :description, :color])
end
end

View File

@ -0,0 +1,66 @@
defmodule Eventos.Groups.Group.TitleSlug do
alias Eventos.Groups.Group
import Ecto.Query
alias Eventos.Repo
use EctoAutoslugField.Slug, from: :title, to: :slug
def build_slug(sources, changeset) do
slug = super(sources, changeset)
build_unique_slug(slug, changeset)
end
defp build_unique_slug(slug, changeset) do
query = from g in Group,
where: g.slug == ^slug
case Repo.one(query) do
nil -> slug
_story ->
slug
|> increment_slug
|> build_unique_slug(changeset)
end
end
defp increment_slug(slug) do
case List.pop_at(String.split(slug, "-"), -1) do
{nil, _} ->
slug
{suffix, slug_parts} ->
case Integer.parse(suffix) do
{id, _} -> Enum.join(slug_parts, "-") <> "-" <> Integer.to_string(id + 1)
:error -> slug <> "-1"
end
end
end
end
defmodule Eventos.Groups.Group do
use Ecto.Schema
import Ecto.Changeset
alias Eventos.Groups.{Group, Member, Request}
alias Eventos.Accounts.Account
alias Eventos.Groups.Group.TitleSlug
schema "groups" do
field :description, :string
field :suspended, :boolean, default: false
field :title, :string
field :slug, TitleSlug.Type
field :uri, :string
field :url, :string
many_to_many :accounts, Account, join_through: Member
has_many :requests, Request
timestamps()
end
@doc false
def changeset(%Group{} = group, attrs) do
group
|> cast(attrs, [:title, :description, :suspended, :url, :uri])
|> validate_required([:title, :description, :suspended, :url, :uri])
|> TitleSlug.maybe_generate_slug()
|> TitleSlug.unique_constraint()
end
end

View File

@ -0,0 +1,296 @@
defmodule Eventos.Groups do
@moduledoc """
The Groups context.
"""
import Ecto.Query, warn: false
alias Eventos.Repo
alias Eventos.Groups.Group
@doc """
Returns the list of groups.
## Examples
iex> list_groups()
[%Group{}, ...]
"""
def list_groups do
Repo.all(Group)
end
@doc """
Gets a single group.
Raises `Ecto.NoResultsError` if the Group does not exist.
## Examples
iex> get_group!(123)
%Group{}
iex> get_group!(456)
** (Ecto.NoResultsError)
"""
def get_group!(id), do: Repo.get!(Group, id)
@doc """
Creates a group.
## Examples
iex> create_group(%{field: value})
{:ok, %Group{}}
iex> create_group(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_group(attrs \\ %{}) do
%Group{}
|> Group.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a group.
## Examples
iex> update_group(group, %{field: new_value})
{:ok, %Group{}}
iex> update_group(group, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_group(%Group{} = group, attrs) do
group
|> Group.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Group.
## Examples
iex> delete_group(group)
{:ok, %Group{}}
iex> delete_group(group)
{:error, %Ecto.Changeset{}}
"""
def delete_group(%Group{} = group) do
Repo.delete(group)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking group changes.
## Examples
iex> change_group(group)
%Ecto.Changeset{source: %Group{}}
"""
def change_group(%Group{} = group) do
Group.changeset(group, %{})
end
alias Eventos.Groups.Member
@doc """
Returns the list of members.
## Examples
iex> list_members()
[%Member{}, ...]
"""
def list_members do
Repo.all(Member)
end
@doc """
Gets a single member.
Raises `Ecto.NoResultsError` if the Member does not exist.
## Examples
iex> get_member!(123)
%Member{}
iex> get_member!(456)
** (Ecto.NoResultsError)
"""
def get_member!(id), do: Repo.get!(Member, id)
@doc """
Creates a member.
## Examples
iex> create_member(%{field: value})
{:ok, %Member{}}
iex> create_member(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_member(attrs \\ %{}) do
%Member{}
|> Member.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a member.
## Examples
iex> update_member(member, %{field: new_value})
{:ok, %Member{}}
iex> update_member(member, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_member(%Member{} = member, attrs) do
member
|> Member.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Member.
## Examples
iex> delete_member(member)
{:ok, %Member{}}
iex> delete_member(member)
{:error, %Ecto.Changeset{}}
"""
def delete_member(%Member{} = member) do
Repo.delete(member)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking member changes.
## Examples
iex> change_member(member)
%Ecto.Changeset{source: %Member{}}
"""
def change_member(%Member{} = member) do
Member.changeset(member, %{})
end
alias Eventos.Groups.Request
@doc """
Returns the list of requests.
## Examples
iex> list_requests()
[%Request{}, ...]
"""
def list_requests do
Repo.all(Request)
end
@doc """
Gets a single request.
Raises `Ecto.NoResultsError` if the Request does not exist.
## Examples
iex> get_request!(123)
%Request{}
iex> get_request!(456)
** (Ecto.NoResultsError)
"""
def get_request!(id), do: Repo.get!(Request, id)
@doc """
Creates a request.
## Examples
iex> create_request(%{field: value})
{:ok, %Request{}}
iex> create_request(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_request(attrs \\ %{}) do
%Request{}
|> Request.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a request.
## Examples
iex> update_request(request, %{field: new_value})
{:ok, %Request{}}
iex> update_request(request, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_request(%Request{} = request, attrs) do
request
|> Request.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a Request.
## Examples
iex> delete_request(request)
{:ok, %Request{}}
iex> delete_request(request)
{:error, %Ecto.Changeset{}}
"""
def delete_request(%Request{} = request) do
Repo.delete(request)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking request changes.
## Examples
iex> change_request(request)
%Ecto.Changeset{source: %Request{}}
"""
def change_request(%Request{} = request) do
Request.changeset(request, %{})
end
end

View File

@ -1,10 +1,11 @@
defmodule Eventos.Accounts.GroupAccount do defmodule Eventos.Groups.Member do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Accounts.{GroupAccount, Account, Group} alias Eventos.Groups.{Member, Group}
alias Eventos.Accounts.Account
@primary_key false
schema "group_accounts" do schema "members" do
field :role, :integer field :role, :integer
belongs_to :group, Group belongs_to :group, Group
belongs_to :account, Account belongs_to :account, Account
@ -13,8 +14,8 @@ defmodule Eventos.Accounts.GroupAccount do
end end
@doc false @doc false
def changeset(%GroupAccount{} = group_account, attrs) do def changeset(%Member{} = member, attrs) do
group_account member
|> cast(attrs, [:role]) |> cast(attrs, [:role])
|> validate_required([:role]) |> validate_required([:role])
end end

View File

@ -1,7 +1,8 @@
defmodule Eventos.Accounts.GroupRequest do defmodule Eventos.Groups.Request do
use Ecto.Schema use Ecto.Schema
import Ecto.Changeset import Ecto.Changeset
alias Eventos.Accounts.{GroupRequest} alias Eventos.Groups.Request
schema "group_requests" do schema "group_requests" do
field :state, :integer field :state, :integer
@ -12,8 +13,8 @@ defmodule Eventos.Accounts.GroupRequest do
end end
@doc false @doc false
def changeset(%GroupRequest{} = group_request, attrs) do def changeset(%Request{} = request, attrs) do
group_request request
|> cast(attrs, [:state]) |> cast(attrs, [:state])
|> validate_required([:state]) |> validate_required([:state])
end end

View File

@ -0,0 +1,3 @@
Postgrex.Types.define(Eventos.PostgresTypes,
[Geo.PostGIS.Extension] ++ Ecto.Adapters.Postgres.extensions(),
json: Poison)

View File

@ -1,10 +1,10 @@
defmodule EventosWeb.AuthPipeline do defmodule EventosWeb.AuthPipeline do
use Guardian.Plug.Pipeline, otp_app: :eventos, use Guardian.Plug.Pipeline, otp_app: :eventos,
module: EventosWeb.Guradian, module: EventosWeb.Guardian,
error_handler: EventosWeb.AuthErrorHandler error_handler: EventosWeb.AuthErrorHandler
plug Guardian.Plug.VerifyHeader, claims: %{"typ" => "access"}, realm: :none plug Guardian.Plug.VerifyHeader, claims: %{"typ" => "access"}
plug Guardian.Plug.EnsureAuthenticated plug Guardian.Plug.EnsureAuthenticated
plug Guardian.Plug.LoadResource, ensure: true plug Guardian.Plug.LoadResource, ensure: true

View File

@ -3,58 +3,37 @@ defmodule EventosWeb.AccountController do
alias Eventos.Accounts alias Eventos.Accounts
alias Eventos.Accounts.Account alias Eventos.Accounts.Account
import Logger
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
accounts = Accounts.list_accounts() accounts = Accounts.list_accounts()
render(conn, "index.html", accounts: accounts) render(conn, "index.json", accounts: accounts)
end
def new(conn, _params) do
changeset = Accounts.change_account(%Account{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"account" => account_params}) do
case Accounts.create_account(account_params) do
{:ok, account} ->
conn
|> put_flash(:info, "Account created successfully.")
|> redirect(to: account_path(conn, :show, account))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
account = Accounts.get_account!(id) account = Accounts.get_account_with_everything!(id)
render(conn, "show.html", account: account) render(conn, "show.json", account: account)
end
def edit(conn, %{"id" => id}) do
account = Accounts.get_account!(id)
changeset = Accounts.change_account(account)
render(conn, "edit.html", account: account, changeset: changeset)
end end
def update(conn, %{"id" => id, "account" => account_params}) do def update(conn, %{"id" => id, "account" => account_params}) do
account = Accounts.get_account!(id) account = Accounts.get_account!(id)
case Accounts.update_account(account, account_params) do with {:ok, %Account{} = account} <- Accounts.update_account(account, account_params) do
{:ok, account} -> render(conn, "show.json", account: account)
conn
|> put_flash(:info, "Account updated successfully.")
|> redirect(to: account_path(conn, :show, account))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", account: account, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id_str}) do
{id, _} = Integer.parse(id_str)
if Guardian.Plug.current_resource(conn).account.id == id do
account = Accounts.get_account!(id) account = Accounts.get_account!(id)
{:ok, _account} = Accounts.delete_account(account) with {:ok, %Account{}} <- Accounts.delete_account(account) do
send_resp(conn, :no_content, "")
conn end
|> put_flash(:info, "Account deleted successfully.") else
|> redirect(to: account_path(conn, :index)) send_resp(conn, 401, "")
end
end end
end end

View File

@ -1,9 +0,0 @@
defmodule EventosWeb.AppController do
use EventosWeb, :controller
plug :put_layout, false
def app(conn, _params) do
render conn, "index.html"
end
end

View File

@ -4,57 +4,39 @@ defmodule EventosWeb.CategoryController do
alias Eventos.Events alias Eventos.Events
alias Eventos.Events.Category alias Eventos.Events.Category
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
categories = Events.list_categories() categories = Events.list_categories()
render(conn, "index.html", categories: categories) render(conn, "index.json", categories: categories)
end
def new(conn, _params) do
changeset = Events.change_category(%Category{})
render(conn, "new.html", changeset: changeset)
end end
def create(conn, %{"category" => category_params}) do def create(conn, %{"category" => category_params}) do
case Events.create_category(category_params) do with {:ok, %Category{} = category} <- Events.create_category(category_params) do
{:ok, category} ->
conn conn
|> put_flash(:info, "Category created successfully.") |> put_status(:created)
|> redirect(to: category_path(conn, :show, category)) |> put_resp_header("location", category_path(conn, :show, category))
{:error, %Ecto.Changeset{} = changeset} -> |> render("show.json", category: category)
render(conn, "new.html", changeset: changeset)
end end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
category = Events.get_category!(id) category = Events.get_category!(id)
render(conn, "show.html", category: category) render(conn, "show.json", category: category)
end
def edit(conn, %{"id" => id}) do
category = Events.get_category!(id)
changeset = Events.change_category(category)
render(conn, "edit.html", category: category, changeset: changeset)
end end
def update(conn, %{"id" => id, "category" => category_params}) do def update(conn, %{"id" => id, "category" => category_params}) do
category = Events.get_category!(id) category = Events.get_category!(id)
case Events.update_category(category, category_params) do with {:ok, %Category{} = category} <- Events.update_category(category, category_params) do
{:ok, category} -> render(conn, "show.json", category: category)
conn
|> put_flash(:info, "Category updated successfully.")
|> redirect(to: category_path(conn, :show, category))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", category: category, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
category = Events.get_category!(id) category = Events.get_category!(id)
{:ok, _category} = Events.delete_category(category) with {:ok, %Category{}} <- Events.delete_category(category) do
send_resp(conn, :no_content, "")
conn end
|> put_flash(:info, "Category deleted successfully.")
|> redirect(to: category_path(conn, :index))
end end
end end

View File

@ -1,60 +0,0 @@
defmodule EventosWeb.EventAccountsController do
use EventosWeb, :controller
alias Eventos.Events
alias Eventos.Events.EventAccounts
def index(conn, _params) do
event_accounts = Events.list_event_accounts()
render(conn, "index.html", event_accounts: event_accounts)
end
def new(conn, _params) do
changeset = Events.change_event_accounts(%EventAccounts{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"event_accounts" => event_accounts_params}) do
case Events.create_event_accounts(event_accounts_params) do
{:ok, event_accounts} ->
conn
|> put_flash(:info, "Event accounts created successfully.")
|> redirect(to: event_accounts_path(conn, :show, event_accounts))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
event_accounts = Events.get_event_accounts!(id)
render(conn, "show.html", event_accounts: event_accounts)
end
def edit(conn, %{"id" => id}) do
event_accounts = Events.get_event_accounts!(id)
changeset = Events.change_event_accounts(event_accounts)
render(conn, "edit.html", event_accounts: event_accounts, changeset: changeset)
end
def update(conn, %{"id" => id, "event_accounts" => event_accounts_params}) do
event_accounts = Events.get_event_accounts!(id)
case Events.update_event_accounts(event_accounts, event_accounts_params) do
{:ok, event_accounts} ->
conn
|> put_flash(:info, "Event accounts updated successfully.")
|> redirect(to: event_accounts_path(conn, :show, event_accounts))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", event_accounts: event_accounts, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
event_accounts = Events.get_event_accounts!(id)
{:ok, _event_accounts} = Events.delete_event_accounts(event_accounts)
conn
|> put_flash(:info, "Event accounts deleted successfully.")
|> redirect(to: event_accounts_path(conn, :index))
end
end

View File

@ -4,57 +4,39 @@ defmodule EventosWeb.EventController do
alias Eventos.Events alias Eventos.Events
alias Eventos.Events.Event alias Eventos.Events.Event
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
events = Events.list_events() events = Events.list_events()
render(conn, "index.html", events: events) render(conn, "index.json", events: events)
end
def new(conn, _params) do
changeset = Events.change_event(%Event{})
render(conn, "new.html", changeset: changeset)
end end
def create(conn, %{"event" => event_params}) do def create(conn, %{"event" => event_params}) do
case Events.create_event(event_params) do with {:ok, %Event{} = event} <- Events.create_event(event_params) do
{:ok, event} ->
conn conn
|> put_flash(:info, "Event created successfully.") |> put_status(:created)
|> redirect(to: event_path(conn, :show, event)) |> put_resp_header("location", event_path(conn, :show, event))
{:error, %Ecto.Changeset{} = changeset} -> |> render("show.json", event: event)
render(conn, "new.html", changeset: changeset)
end end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
event = Events.get_event!(id) event = Events.get_event!(id)
render(conn, "show.html", event: event) render(conn, "show.json", event: event)
end
def edit(conn, %{"id" => id}) do
event = Events.get_event!(id)
changeset = Events.change_event(event)
render(conn, "edit.html", event: event, changeset: changeset)
end end
def update(conn, %{"id" => id, "event" => event_params}) do def update(conn, %{"id" => id, "event" => event_params}) do
event = Events.get_event!(id) event = Events.get_event!(id)
case Events.update_event(event, event_params) do with {:ok, %Event{} = event} <- Events.update_event(event, event_params) do
{:ok, event} -> render(conn, "show.json", event: event)
conn
|> put_flash(:info, "Event updated successfully.")
|> redirect(to: event_path(conn, :show, event))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", event: event, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
event = Events.get_event!(id) event = Events.get_event!(id)
{:ok, _event} = Events.delete_event(event) with {:ok, %Event{}} <- Events.delete_event(event) do
send_resp(conn, :no_content, "")
conn end
|> put_flash(:info, "Event deleted successfully.")
|> redirect(to: event_path(conn, :index))
end end
end end

View File

@ -1,60 +0,0 @@
defmodule EventosWeb.EventRequestController do
use EventosWeb, :controller
alias Eventos.Events
alias Eventos.Events.EventRequest
def index(conn, _params) do
event_requests = Events.list_event_requests()
render(conn, "index.html", event_requests: event_requests)
end
def new(conn, _params) do
changeset = Events.change_event_request(%EventRequest{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"event_request" => event_request_params}) do
case Events.create_event_request(event_request_params) do
{:ok, event_request} ->
conn
|> put_flash(:info, "Event request created successfully.")
|> redirect(to: event_request_path(conn, :show, event_request))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
event_request = Events.get_event_request!(id)
render(conn, "show.html", event_request: event_request)
end
def edit(conn, %{"id" => id}) do
event_request = Events.get_event_request!(id)
changeset = Events.change_event_request(event_request)
render(conn, "edit.html", event_request: event_request, changeset: changeset)
end
def update(conn, %{"id" => id, "event_request" => event_request_params}) do
event_request = Events.get_event_request!(id)
case Events.update_event_request(event_request, event_request_params) do
{:ok, event_request} ->
conn
|> put_flash(:info, "Event request updated successfully.")
|> redirect(to: event_request_path(conn, :show, event_request))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", event_request: event_request, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
event_request = Events.get_event_request!(id)
{:ok, _event_request} = Events.delete_event_request(event_request)
conn
|> put_flash(:info, "Event request deleted successfully.")
|> redirect(to: event_request_path(conn, :index))
end
end

View File

@ -0,0 +1,20 @@
defmodule EventosWeb.FallbackController do
@moduledoc """
Translates controller action results into valid `Plug.Conn` responses.
See `Phoenix.Controller.action_fallback/1` for more details.
"""
use EventosWeb, :controller
def call(conn, {:error, %Ecto.Changeset{} = changeset}) do
conn
|> put_status(:unprocessable_entity)
|> render(EventosWeb.ChangesetView, "error.json", changeset: changeset)
end
def call(conn, {:error, :not_found}) do
conn
|> put_status(:not_found)
|> render(EventosWeb.ErrorView, :"404")
end
end

View File

@ -1,60 +0,0 @@
defmodule EventosWeb.GroupAccountController do
use EventosWeb, :controller
alias Eventos.Accounts
alias Eventos.Accounts.GroupAccount
def index(conn, _params) do
group_accounts = Accounts.list_group_accounts()
render(conn, "index.html", group_accounts: group_accounts)
end
def new(conn, _params) do
changeset = Accounts.change_group_account(%GroupAccount{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"group_account" => group_account_params}) do
case Accounts.create_group_account(group_account_params) do
{:ok, group_account} ->
conn
|> put_flash(:info, "Group account created successfully.")
|> redirect(to: group_account_path(conn, :show, group_account))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
group_account = Accounts.get_group_account!(id)
render(conn, "show.html", group_account: group_account)
end
def edit(conn, %{"id" => id}) do
group_account = Accounts.get_group_account!(id)
changeset = Accounts.change_group_account(group_account)
render(conn, "edit.html", group_account: group_account, changeset: changeset)
end
def update(conn, %{"id" => id, "group_account" => group_account_params}) do
group_account = Accounts.get_group_account!(id)
case Accounts.update_group_account(group_account, group_account_params) do
{:ok, group_account} ->
conn
|> put_flash(:info, "Group account updated successfully.")
|> redirect(to: group_account_path(conn, :show, group_account))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", group_account: group_account, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
group_account = Accounts.get_group_account!(id)
{:ok, _group_account} = Accounts.delete_group_account(group_account)
conn
|> put_flash(:info, "Group account deleted successfully.")
|> redirect(to: group_account_path(conn, :index))
end
end

View File

@ -1,60 +1,42 @@
defmodule EventosWeb.GroupController do defmodule EventosWeb.GroupController do
use EventosWeb, :controller use EventosWeb, :controller
alias Eventos.Accounts alias Eventos.Groups
alias Eventos.Accounts.Group alias Eventos.Groups.Group
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
groups = Accounts.list_groups() groups = Groups.list_groups()
render(conn, "index.html", groups: groups) render(conn, "index.json", groups: groups)
end
def new(conn, _params) do
changeset = Accounts.change_group(%Group{})
render(conn, "new.html", changeset: changeset)
end end
def create(conn, %{"group" => group_params}) do def create(conn, %{"group" => group_params}) do
case Accounts.create_group(group_params) do with {:ok, %Group{} = group} <- Groups.create_group(group_params) do
{:ok, group} ->
conn conn
|> put_flash(:info, "Group created successfully.") |> put_status(:created)
|> redirect(to: group_path(conn, :show, group)) |> put_resp_header("location", group_path(conn, :show, group))
{:error, %Ecto.Changeset{} = changeset} -> |> render("show.json", group: group)
render(conn, "new.html", changeset: changeset)
end end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
group = Accounts.get_group!(id) group = Groups.get_group!(id)
render(conn, "show.html", group: group) render(conn, "show.json", group: group)
end
def edit(conn, %{"id" => id}) do
group = Accounts.get_group!(id)
changeset = Accounts.change_group(group)
render(conn, "edit.html", group: group, changeset: changeset)
end end
def update(conn, %{"id" => id, "group" => group_params}) do def update(conn, %{"id" => id, "group" => group_params}) do
group = Accounts.get_group!(id) group = Groups.get_group!(id)
case Accounts.update_group(group, group_params) do with {:ok, %Group{} = group} <- Groups.update_group(group, group_params) do
{:ok, group} -> render(conn, "show.json", group: group)
conn
|> put_flash(:info, "Group updated successfully.")
|> redirect(to: group_path(conn, :show, group))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", group: group, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
group = Accounts.get_group!(id) group = Groups.get_group!(id)
{:ok, _group} = Accounts.delete_group(group) with {:ok, %Group{}} <- Groups.delete_group(group) do
send_resp(conn, :no_content, "")
conn end
|> put_flash(:info, "Group deleted successfully.")
|> redirect(to: group_path(conn, :index))
end end
end end

View File

@ -1,60 +0,0 @@
defmodule EventosWeb.GroupRequestController do
use EventosWeb, :controller
alias Eventos.Accounts
alias Eventos.Accounts.GroupRequest
def index(conn, _params) do
group_request = Accounts.list_group_requests()
render(conn, "index.html", group_request: group_request)
end
def new(conn, _params) do
changeset = Accounts.change_group_request(%GroupRequest{})
render(conn, "new.html", changeset: changeset)
end
def create(conn, %{"group_request" => group_request_params}) do
case Accounts.create_group_request(group_request_params) do
{:ok, group_request} ->
conn
|> put_flash(:info, "Group request created successfully.")
|> redirect(to: group_request_path(conn, :show, group_request))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "new.html", changeset: changeset)
end
end
def show(conn, %{"id" => id}) do
group_request = Accounts.get_group_request!(id)
render(conn, "show.html", group_request: group_request)
end
def edit(conn, %{"id" => id}) do
group_request = Accounts.get_group_request!(id)
changeset = Accounts.change_group_request(group_request)
render(conn, "edit.html", group_request: group_request, changeset: changeset)
end
def update(conn, %{"id" => id, "group_request" => group_request_params}) do
group_request = Accounts.get_group_request!(id)
case Accounts.update_group_request(group_request, group_request_params) do
{:ok, group_request} ->
conn
|> put_flash(:info, "Group request updated successfully.")
|> redirect(to: group_request_path(conn, :show, group_request))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", group_request: group_request, changeset: changeset)
end
end
def delete(conn, %{"id" => id}) do
group_request = Accounts.get_group_request!(id)
{:ok, _group_request} = Accounts.delete_group_request(group_request)
conn
|> put_flash(:info, "Group request deleted successfully.")
|> redirect(to: group_request_path(conn, :index))
end
end

View File

@ -1,6 +1,7 @@
defmodule EventosWeb.PageController do defmodule EventosWeb.PageController do
use EventosWeb, :controller use EventosWeb, :controller
import Logger
plug :put_layout, false
def index(conn, _params) do def index(conn, _params) do
render conn, "index.html" render conn, "index.html"

View File

@ -1,30 +1,42 @@
defmodule EventosWeb.SessionController do defmodule EventosWeb.SessionController do
use EventosWeb, :controller use EventosWeb, :controller
alias Eventos.Accounts.User
alias Eventos.Accounts
def sign_in(conn, %{"email" => email, "password" => password}) do alias Eventos.Events
with %User{} = user <- Accounts.find(email) do alias Eventos.Events.Session
# Attempt to authenticate the user
with {:ok, token, _claims} <- Accounts.authenticate(%{user: user, password: password}) do action_fallback EventosWeb.FallbackController
# Render the token
user = Eventos.Repo.preload user, :account def index(conn, _params) do
render conn, "token.json", %{token: token, user: user} sessions = Events.list_sessions()
end render(conn, "index.json", sessions: sessions)
send_resp(conn, 400, "Bad login")
end
send_resp(conn, 400, "No such user")
end end
def sign_out(conn, _params) do def create(conn, %{"session" => session_params}) do
with {:ok, %Session{} = session} <- Events.create_session(session_params) do
conn conn
|> Eventos.Guardian.Plug.sign_out() |> put_status(:created)
|> send_resp(204, "") |> put_resp_header("location", session_path(conn, :show, session))
|> render("show.json", session: session)
end
end end
def show(conn, _params) do def show(conn, %{"id" => id}) do
user = Eventos.Guardian.Plug.current_resource(conn) session = Events.get_session!(id)
render(conn, "show.json", session: session)
end
send_resp(conn, 200, Poison.encode!(%{user: user})) def update(conn, %{"id" => id, "session" => session_params}) do
session = Events.get_session!(id)
with {:ok, %Session{} = session} <- Events.update_session(session, session_params) do
render(conn, "show.json", session: session)
end
end
def delete(conn, %{"id" => id}) do
session = Events.get_session!(id)
with {:ok, %Session{}} <- Events.delete_session(session) do
send_resp(conn, :no_content, "")
end
end end
end end

View File

@ -4,57 +4,39 @@ defmodule EventosWeb.TagController do
alias Eventos.Events alias Eventos.Events
alias Eventos.Events.Tag alias Eventos.Events.Tag
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
tags = Events.list_tags() tags = Events.list_tags()
render(conn, "index.html", tags: tags) render(conn, "index.json", tags: tags)
end
def new(conn, _params) do
changeset = Events.change_tag(%Tag{})
render(conn, "new.html", changeset: changeset)
end end
def create(conn, %{"tag" => tag_params}) do def create(conn, %{"tag" => tag_params}) do
case Events.create_tag(tag_params) do with {:ok, %Tag{} = tag} <- Events.create_tag(tag_params) do
{:ok, tag} ->
conn conn
|> put_flash(:info, "Tag created successfully.") |> put_status(:created)
|> redirect(to: tag_path(conn, :show, tag)) |> put_resp_header("location", tag_path(conn, :show, tag))
{:error, %Ecto.Changeset{} = changeset} -> |> render("show.json", tag: tag)
render(conn, "new.html", changeset: changeset)
end end
end end
def show(conn, %{"id" => id}) do def show(conn, %{"id" => id}) do
tag = Events.get_tag!(id) tag = Events.get_tag!(id)
render(conn, "show.html", tag: tag) render(conn, "show.json", tag: tag)
end
def edit(conn, %{"id" => id}) do
tag = Events.get_tag!(id)
changeset = Events.change_tag(tag)
render(conn, "edit.html", tag: tag, changeset: changeset)
end end
def update(conn, %{"id" => id, "tag" => tag_params}) do def update(conn, %{"id" => id, "tag" => tag_params}) do
tag = Events.get_tag!(id) tag = Events.get_tag!(id)
case Events.update_tag(tag, tag_params) do with {:ok, %Tag{} = tag} <- Events.update_tag(tag, tag_params) do
{:ok, tag} -> render(conn, "show.json", tag: tag)
conn
|> put_flash(:info, "Tag updated successfully.")
|> redirect(to: tag_path(conn, :show, tag))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", tag: tag, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
tag = Events.get_tag!(id) tag = Events.get_tag!(id)
{:ok, _tag} = Events.delete_tag(tag) with {:ok, %Tag{}} <- Events.delete_tag(tag) do
send_resp(conn, :no_content, "")
conn end
|> put_flash(:info, "Tag deleted successfully.")
|> redirect(to: tag_path(conn, :index))
end end
end end

View File

@ -0,0 +1,42 @@
defmodule EventosWeb.TrackController do
use EventosWeb, :controller
alias Eventos.Events
alias Eventos.Events.Track
action_fallback EventosWeb.FallbackController
def index(conn, _params) do
tracks = Events.list_tracks()
render(conn, "index.json", tracks: tracks)
end
def create(conn, %{"track" => track_params}) do
with {:ok, %Track{} = track} <- Events.create_track(track_params) do
conn
|> put_status(:created)
|> put_resp_header("location", track_path(conn, :show, track))
|> render("show.json", track: track)
end
end
def show(conn, %{"id" => id}) do
track = Events.get_track!(id)
render(conn, "show.json", track: track)
end
def update(conn, %{"id" => id, "track" => track_params}) do
track = Events.get_track!(id)
with {:ok, %Track{} = track} <- Events.update_track(track, track_params) do
render(conn, "show.json", track: track)
end
end
def delete(conn, %{"id" => id}) do
track = Events.get_track!(id)
with {:ok, %Track{}} <- Events.delete_track(track) do
send_resp(conn, :no_content, "")
end
end
end

View File

@ -4,88 +4,66 @@ defmodule EventosWeb.UserController do
alias Eventos.Accounts alias Eventos.Accounts
alias Eventos.Accounts.User alias Eventos.Accounts.User
alias Eventos.Repo
action_fallback EventosWeb.FallbackController
def index(conn, _params) do def index(conn, _params) do
users = Accounts.list_users() users = Accounts.list_users_with_accounts()
render(conn, "index.html", users: users) render(conn, "index.json", users: users)
end end
def new(conn, _params) do def register(conn, %{"username" => username, "email" => email, "password" => password}) do
changeset = Accounts.change_user(%User{}) case Accounts.register(%{email: email, password: password, username: username}) do
render(conn, "new.html", changeset: changeset) {:ok, %User{} = user} ->
end Logger.debug(inspect user)
{:ok, token, _claims} = EventosWeb.Guardian.encode_and_sign(user)
def create(conn, %{"user" => user_params}) do
case Accounts.create_user(user_params) do
{:ok, user} ->
conn conn
|> put_flash(:info, "User created successfully.") |> put_status(:created)
|> redirect(to: user_path(conn, :show, user)) |> render "show_with_token.json", %{token: token, user: user}
{:error, %Ecto.Changeset{} = changeset} -> {:error, error} ->
render(conn, "new.html", changeset: changeset) conn
|> put_resp_content_type("application/json")
|> send_resp(400, Poison.encode!(%{"msg" => handle_changeset_errors(error)}))
end end
end end
def show(conn, %{"id" => id}) do def show_current_account(conn, _params) do
user = Accounts.get_user!(id) user = Guardian.Plug.current_resource(conn)
render(conn, "show.html", user: user) |> Repo.preload :account
render(conn, "show_simple.json", user: user)
end end
def edit(conn, %{"id" => id}) do defp handle_changeset_errors(errors) do
user = Accounts.get_user!(id) Enum.map(errors, fn {field, detail} ->
changeset = Accounts.change_user(user) "#{field} " <> render_detail(detail)
render(conn, "edit.html", user: user, changeset: changeset) end)
|> Enum.join
end
defp render_detail({message, values}) do
Enum.reduce values, message, fn {k, v}, acc ->
String.replace(acc, "%{#{k}}", to_string(v))
end
end
defp render_detail(message) do
message
end end
def update(conn, %{"id" => id, "user" => user_params}) do def update(conn, %{"id" => id, "user" => user_params}) do
user = Accounts.get_user!(id) user = Accounts.get_user!(id)
case Accounts.update_user(user, user_params) do with {:ok, %User{} = user} <- Accounts.update_user(user, user_params) do
{:ok, user} -> render(conn, "show.json", user: user)
conn
|> put_flash(:info, "User updated successfully.")
|> redirect(to: user_path(conn, :show, user))
{:error, %Ecto.Changeset{} = changeset} ->
render(conn, "edit.html", user: user, changeset: changeset)
end end
end end
def delete(conn, %{"id" => id}) do def delete(conn, %{"id" => id}) do
user = Accounts.get_user!(id) user = Accounts.get_user!(id)
{:ok, _user} = Accounts.delete_user(user) with {:ok, %User{}} <- Accounts.delete_user(user) do
send_resp(conn, :no_content, "")
conn
|> put_flash(:info, "User deleted successfully.")
|> redirect(to: user_path(conn, :index))
end end
def register(conn, %{"email" => email, "password" => password, "username" => username}) do
{:ok, {privkey, pubkey}} = RsaEx.generate_keypair("4096")
account_change = Ecto.Changeset.change(%Eventos.Accounts.Account{}, %{
username: username,
description: "tata",
display_name: "toto",
domain: nil,
private_key: privkey,
public_key: pubkey,
uri: "",
url: ""
})
user_change = Eventos.Accounts.User.registration_changeset(%Eventos.Accounts.User{}, %{
email: email,
password: password,
password_confirmation: password
})
account_with_user = Ecto.Changeset.put_assoc(account_change, :user, user_change)
Eventos.Repo.insert!(account_with_user)
user = Eventos.Accounts.find(email)
user = Eventos.Repo.preload user, :account
render conn, "user.json", %{user: user}
end end
end end

View File

@ -0,0 +1,28 @@
defmodule EventosWeb.UserSessionController do
use EventosWeb, :controller
alias Eventos.Accounts.User
alias Eventos.Accounts
import Logger
def sign_in(conn, %{"email" => email, "password" => password}) do
case Accounts.find_by_email(email) do
%User{} = user ->
# Attempt to authenticate the user
case Accounts.authenticate(%{user: user, password: password}) do
{:ok, token, _claims} ->
# Render the token
render conn, "token.json", %{token: token, user: user}
_ ->
send_resp(conn, 400, Poison.encode!(%{"error_msg" => "Bad login", "display_error" => "session.error.bad_login", "error_code" => 400}))
end
_ ->
send_resp(conn, 400, Poison.encode!(%{"error_msg" => "No such user", "display_error" => "session.error.bad_login", "error_code" => 400}))
end
end
def sign_out(conn, _params) do
conn
|> Guardian.Plug.sign_out()
|> send_resp(204, "")
end
end

View File

@ -4,8 +4,10 @@ defmodule EventosWeb.Guardian do
user: [:base] user: [:base]
} }
import Logger
alias Eventos.Accounts alias Eventos.Accounts
alias Eventos.Accounts.User alias Eventos.Accounts.{Account, User}
def subject_for_token(user = %User{}, _claims) do def subject_for_token(user = %User{}, _claims) do
{:ok, "User:" <> to_string(user.id)} {:ok, "User:" <> to_string(user.id)}
@ -17,9 +19,11 @@ defmodule EventosWeb.Guardian do
def resource_from_claims(%{"sub" => "User:" <> uid_str}) do def resource_from_claims(%{"sub" => "User:" <> uid_str}) do
try do try do
Logger.debug("Inspecting resource token")
Logger.debug(inspect uid_str)
case Integer.parse(uid_str) do case Integer.parse(uid_str) do
{uid, ""} -> {uid, ""} ->
{:ok, Accounts.get_user!(uid)} {:ok, Accounts.get_user_with_account!(uid)}
_ -> _ ->
{:error, :invalid_id} {:error, :invalid_id}
end end
@ -28,13 +32,34 @@ defmodule EventosWeb.Guardian do
end end
end end
def resource_from_claims(_claims) do def resource_from_claims(claims) do
Logger.debug("Check bad resource")
Logger.debug(inspect claims)
{:error, :reason_for_error} {:error, :reason_for_error}
end end
# def build_claims(claims, _resource, opts) do def after_encode_and_sign(resource, claims, token, _options) do
# claims = claims with {:ok, _} <- Guardian.DB.after_encode_and_sign(resource, claims["typ"], claims, token) do
# |> encode_permissions_into_claims!(Keyword.get(opts, :permissions)) {:ok, token}
# {:ok, claims} end
# end end
def on_verify(claims, token, _options) do
Logger.debug(inspect claims)
with {:ok, _} <- Guardian.DB.on_verify(claims, token) do
{:ok, claims}
end
end
def on_revoke(claims, token, _options) do
with {:ok, _} <- Guardian.DB.on_revoke(claims, token) do
{:ok, claims}
end
end
# def build_claims(claims, _resource, opts) do
# claims = claims
# |> encode_permissions_into_claims!(Keyword.get(opts, :permissions))
# {:ok, claims}
# end
end end

View File

@ -6,6 +6,7 @@ defmodule EventosWeb.Router do
end end
pipeline :api_auth do pipeline :api_auth do
plug :accepts, ["json"]
plug EventosWeb.AuthPipeline plug EventosWeb.AuthPipeline
end end
@ -21,17 +22,24 @@ defmodule EventosWeb.Router do
pipe_through :api pipe_through :api
post "/users", UserController, :register post "/users", UserController, :register
post "/login", SessionController, :sign_in post "/login", UserSessionController, :sign_in
resources "/groups", GroupController, only: [:index] resources "/groups", GroupController, only: [:index, :show]
resources "/events", EventController, only: [:index, :show]
resources "/accounts", AccountController, only: [:index, :show]
resources "/tags", TagController, only: [:index, :show]
resources "/categories", CategoryController, only: [:index, :show]
resources "/sessions", SessionController, only: [:index, :show]
resources "/tracks", TrackController, only: [:index, :show]
end end
# Other scopes may use custom stacks. # Other scopes may use custom stacks.
scope "/api", EventosWeb do scope "/api", EventosWeb do
pipe_through :api_auth pipe_through :api_auth
post "/sign-out", SessionController, :sign_out get "/user", UserController, :show_current_account
resources "/users", UserController post "/sign-out", UserSessionController, :sign_out
resources "/accounts", AccountController resources "/users", UserController, except: [:new, :edit, :show]
resources "/accounts", AccountController, except: [:new, :edit]
resources "/events", EventController resources "/events", EventController
resources "/categories", CategoryController resources "/categories", CategoryController
resources "/tags", TagController resources "/tags", TagController
@ -40,11 +48,13 @@ defmodule EventosWeb.Router do
resources "/groups", GroupController, except: [:index] resources "/groups", GroupController, except: [:index]
resources "/group_accounts", GroupAccountController resources "/group_accounts", GroupAccountController
resources "/group_requests", GroupRequestController resources "/group_requests", GroupRequestController
resources "/sessions", SessionController, except: [:new, :edit]
resources "/tracks", TrackController, except: [:new, :edit]
end end
scope "/", EventosWeb do scope "/", EventosWeb do
pipe_through :browser pipe_through :browser
get "/*path", AppController, :app get "/*path", PageController, :index
end end
end end

View File

@ -1,5 +0,0 @@
<h2>Edit Account</h2>
<%= render "form.html", Map.put(assigns, :action, account_path(@conn, :update, @account)) %>
<span><%= link "Back", to: account_path(@conn, :index) %></span>

View File

@ -1,65 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :username, class: "control-label" %>
<%= text_input f, :username, class: "form-control" %>
<%= error_tag f, :username %>
</div>
<div class="form-group">
<%= label f, :domain, class: "control-label" %>
<%= text_input f, :domain, class: "form-control" %>
<%= error_tag f, :domain %>
</div>
<div class="form-group">
<%= label f, :display_name, class: "control-label" %>
<%= text_input f, :display_name, class: "form-control" %>
<%= error_tag f, :display_name %>
</div>
<div class="form-group">
<%= label f, :description, class: "control-label" %>
<%= text_input f, :description, class: "form-control" %>
<%= error_tag f, :description %>
</div>
<div class="form-group">
<%= label f, :private_key, class: "control-label" %>
<%= text_input f, :private_key, class: "form-control" %>
<%= error_tag f, :private_key %>
</div>
<div class="form-group">
<%= label f, :public_key, class: "control-label" %>
<%= text_input f, :public_key, class: "form-control" %>
<%= error_tag f, :public_key %>
</div>
<div class="form-group">
<%= label f, :suspended, class: "control-label" %>
<%= checkbox f, :suspended, class: "checkbox" %>
<%= error_tag f, :suspended %>
</div>
<div class="form-group">
<%= label f, :uri, class: "control-label" %>
<%= text_input f, :uri, class: "form-control" %>
<%= error_tag f, :uri %>
</div>
<div class="form-group">
<%= label f, :url, class: "control-label" %>
<%= text_input f, :url, class: "form-control" %>
<%= error_tag f, :url %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,42 +0,0 @@
<h2>Listing Accounts</h2>
<table class="table">
<thead>
<tr>
<th>Username</th>
<th>Domain</th>
<th>Display name</th>
<th>Description</th>
<th>Private key</th>
<th>Public key</th>
<th>Suspended</th>
<th>Uri</th>
<th>Url</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for account <- @accounts do %>
<tr>
<td><%= account.username %></td>
<td><%= account.domain %></td>
<td><%= account.display_name %></td>
<td><%= account.description %></td>
<td><%= account.private_key %></td>
<td><%= account.public_key %></td>
<td><%= account.suspended %></td>
<td><%= account.uri %></td>
<td><%= account.url %></td>
<td class="text-right">
<span><%= link "Show", to: account_path(@conn, :show, account), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: account_path(@conn, :edit, account), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: account_path(@conn, :delete, account), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Account", to: account_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Account</h2>
<%= render "form.html", Map.put(assigns, :action, account_path(@conn, :create)) %>
<span><%= link "Back", to: account_path(@conn, :index) %></span>

View File

@ -1,53 +0,0 @@
<h2>Show Account</h2>
<ul>
<li>
<strong>Username:</strong>
<%= @account.username %>
</li>
<li>
<strong>Domain:</strong>
<%= @account.domain %>
</li>
<li>
<strong>Display name:</strong>
<%= @account.display_name %>
</li>
<li>
<strong>Description:</strong>
<%= @account.description %>
</li>
<li>
<strong>Private key:</strong>
<%= @account.private_key %>
</li>
<li>
<strong>Public key:</strong>
<%= @account.public_key %>
</li>
<li>
<strong>Suspended:</strong>
<%= @account.suspended %>
</li>
<li>
<strong>Uri:</strong>
<%= @account.uri %>
</li>
<li>
<strong>Url:</strong>
<%= @account.url %>
</li>
</ul>
<span><%= link "Edit", to: account_path(@conn, :edit, @account) %></span>
<span><%= link "Back", to: account_path(@conn, :index) %></span>

View File

@ -1 +0,0 @@
<!DOCTYPE html><html><head><link href="https://fonts.googleapis.com/css?family=Roboto:300,400,500,700|Material+Icons" rel=stylesheet><script src="https://maps.googleapis.com/maps/api/js?key=AIzaSyBF37pw38j0giICt73TCAPNogc07Upe_Q4&libraries=places"></script><meta charset=utf-8><title>libre-event</title><link href=/css/app.c6f4f0637b07f4b32d59e43e26ada6c7.css rel=stylesheet></head><body><noscript>Mets du JS.</noscript><div id=app></div><script type=text/javascript src=/js/manifest.79c2975577a8222315fd.js></script><script type=text/javascript src=/js/vendor.94561603df84d1708ae1.js></script><script type=text/javascript src=/js/app.dc4c839388191b886181.js></script></body></html>

View File

@ -1,5 +0,0 @@
<h2>Edit Category</h2>
<%= render "form.html", Map.put(assigns, :action, category_path(@conn, :update, @category)) %>
<span><%= link "Back", to: category_path(@conn, :index) %></span>

View File

@ -1,23 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :title, class: "control-label" %>
<%= text_input f, :title, class: "form-control" %>
<%= error_tag f, :title %>
</div>
<div class="form-group">
<%= label f, :picture, class: "control-label" %>
<%= text_input f, :picture, class: "form-control" %>
<%= error_tag f, :picture %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,28 +0,0 @@
<h2>Listing Categories</h2>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Picture</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for category <- @categories do %>
<tr>
<td><%= category.title %></td>
<td><%= category.picture %></td>
<td class="text-right">
<span><%= link "Show", to: category_path(@conn, :show, category), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: category_path(@conn, :edit, category), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: category_path(@conn, :delete, category), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Category", to: category_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Category</h2>
<%= render "form.html", Map.put(assigns, :action, category_path(@conn, :create)) %>
<span><%= link "Back", to: category_path(@conn, :index) %></span>

View File

@ -1,18 +0,0 @@
<h2>Show Category</h2>
<ul>
<li>
<strong>Title:</strong>
<%= @category.title %>
</li>
<li>
<strong>Picture:</strong>
<%= @category.picture %>
</li>
</ul>
<span><%= link "Edit", to: category_path(@conn, :edit, @category) %></span>
<span><%= link "Back", to: category_path(@conn, :index) %></span>

View File

@ -1,5 +0,0 @@
<h2>Edit Event</h2>
<%= render "form.html", Map.put(assigns, :action, event_path(@conn, :update, @event)) %>
<span><%= link "Back", to: event_path(@conn, :index) %></span>

View File

@ -1,35 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :title, class: "control-label" %>
<%= text_input f, :title, class: "form-control" %>
<%= error_tag f, :title %>
</div>
<div class="form-group">
<%= label f, :description, class: "control-label" %>
<%= text_input f, :description, class: "form-control" %>
<%= error_tag f, :description %>
</div>
<div class="form-group">
<%= label f, :begin_on, class: "control-label" %>
<%= datetime_select f, :begin_on, class: "form-control" %>
<%= error_tag f, :begin_on %>
</div>
<div class="form-group">
<%= label f, :ends_on, class: "control-label" %>
<%= datetime_select f, :ends_on, class: "form-control" %>
<%= error_tag f, :ends_on %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,32 +0,0 @@
<h2>Listing Events</h2>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Begin on</th>
<th>Ends on</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for event <- @events do %>
<tr>
<td><%= event.title %></td>
<td><%= event.description %></td>
<td><%= event.begin_on %></td>
<td><%= event.ends_on %></td>
<td class="text-right">
<span><%= link "Show", to: event_path(@conn, :show, event), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: event_path(@conn, :edit, event), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: event_path(@conn, :delete, event), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Event", to: event_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Event</h2>
<%= render "form.html", Map.put(assigns, :action, event_path(@conn, :create)) %>
<span><%= link "Back", to: event_path(@conn, :index) %></span>

View File

@ -1,28 +0,0 @@
<h2>Show Event</h2>
<ul>
<li>
<strong>Title:</strong>
<%= @event.title %>
</li>
<li>
<strong>Description:</strong>
<%= @event.description %>
</li>
<li>
<strong>Begin on:</strong>
<%= @event.begin_on %>
</li>
<li>
<strong>Ends on:</strong>
<%= @event.ends_on %>
</li>
</ul>
<span><%= link "Edit", to: event_path(@conn, :edit, @event) %></span>
<span><%= link "Back", to: event_path(@conn, :index) %></span>

View File

@ -1,5 +0,0 @@
<h2>Edit Event accounts</h2>
<%= render "form.html", Map.put(assigns, :action, event_accounts_path(@conn, :update, @event_accounts)) %>
<span><%= link "Back", to: event_accounts_path(@conn, :index) %></span>

View File

@ -1,17 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :roles, class: "control-label" %>
<%= number_input f, :roles, class: "form-control" %>
<%= error_tag f, :roles %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,26 +0,0 @@
<h2>Listing Event accounts</h2>
<table class="table">
<thead>
<tr>
<th>Roles</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for event_accounts <- @event_accounts do %>
<tr>
<td><%= event_accounts.roles %></td>
<td class="text-right">
<span><%= link "Show", to: event_accounts_path(@conn, :show, event_accounts), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: event_accounts_path(@conn, :edit, event_accounts), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: event_accounts_path(@conn, :delete, event_accounts), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Event accounts", to: event_accounts_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Event accounts</h2>
<%= render "form.html", Map.put(assigns, :action, event_accounts_path(@conn, :create)) %>
<span><%= link "Back", to: event_accounts_path(@conn, :index) %></span>

View File

@ -1,13 +0,0 @@
<h2>Show Event accounts</h2>
<ul>
<li>
<strong>Roles:</strong>
<%= @event_accounts.roles %>
</li>
</ul>
<span><%= link "Edit", to: event_accounts_path(@conn, :edit, @event_accounts) %></span>
<span><%= link "Back", to: event_accounts_path(@conn, :index) %></span>

View File

@ -1,5 +0,0 @@
<h2>Edit Event request</h2>
<%= render "form.html", Map.put(assigns, :action, event_request_path(@conn, :update, @event_request)) %>
<span><%= link "Back", to: event_request_path(@conn, :index) %></span>

View File

@ -1,17 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :state, class: "control-label" %>
<%= number_input f, :state, class: "form-control" %>
<%= error_tag f, :state %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,26 +0,0 @@
<h2>Listing Event requests</h2>
<table class="table">
<thead>
<tr>
<th>State</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for event_request <- @event_requests do %>
<tr>
<td><%= event_request.state %></td>
<td class="text-right">
<span><%= link "Show", to: event_request_path(@conn, :show, event_request), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: event_request_path(@conn, :edit, event_request), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: event_request_path(@conn, :delete, event_request), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Event request", to: event_request_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Event request</h2>
<%= render "form.html", Map.put(assigns, :action, event_request_path(@conn, :create)) %>
<span><%= link "Back", to: event_request_path(@conn, :index) %></span>

View File

@ -1,13 +0,0 @@
<h2>Show Event request</h2>
<ul>
<li>
<strong>State:</strong>
<%= @event_request.state %>
</li>
</ul>
<span><%= link "Edit", to: event_request_path(@conn, :edit, @event_request) %></span>
<span><%= link "Back", to: event_request_path(@conn, :index) %></span>

View File

@ -1,5 +0,0 @@
<h2>Edit Group</h2>
<%= render "form.html", Map.put(assigns, :action, group_path(@conn, :update, @group)) %>
<span><%= link "Back", to: group_path(@conn, :index) %></span>

View File

@ -1,41 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :title, class: "control-label" %>
<%= text_input f, :title, class: "form-control" %>
<%= error_tag f, :title %>
</div>
<div class="form-group">
<%= label f, :description, class: "control-label" %>
<%= text_input f, :description, class: "form-control" %>
<%= error_tag f, :description %>
</div>
<div class="form-group">
<%= label f, :suspended, class: "control-label" %>
<%= checkbox f, :suspended, class: "checkbox" %>
<%= error_tag f, :suspended %>
</div>
<div class="form-group">
<%= label f, :url, class: "control-label" %>
<%= text_input f, :url, class: "form-control" %>
<%= error_tag f, :url %>
</div>
<div class="form-group">
<%= label f, :uri, class: "control-label" %>
<%= text_input f, :uri, class: "form-control" %>
<%= error_tag f, :uri %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,34 +0,0 @@
<h2>Listing Groups</h2>
<table class="table">
<thead>
<tr>
<th>Title</th>
<th>Description</th>
<th>Suspended</th>
<th>Url</th>
<th>Uri</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for group <- @groups do %>
<tr>
<td><%= group.title %></td>
<td><%= group.description %></td>
<td><%= group.suspended %></td>
<td><%= group.url %></td>
<td><%= group.uri %></td>
<td class="text-right">
<span><%= link "Show", to: group_path(@conn, :show, group), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: group_path(@conn, :edit, group), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: group_path(@conn, :delete, group), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Group", to: group_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Group</h2>
<%= render "form.html", Map.put(assigns, :action, group_path(@conn, :create)) %>
<span><%= link "Back", to: group_path(@conn, :index) %></span>

View File

@ -1,33 +0,0 @@
<h2>Show Group</h2>
<ul>
<li>
<strong>Title:</strong>
<%= @group.title %>
</li>
<li>
<strong>Description:</strong>
<%= @group.description %>
</li>
<li>
<strong>Suspended:</strong>
<%= @group.suspended %>
</li>
<li>
<strong>Url:</strong>
<%= @group.url %>
</li>
<li>
<strong>Uri:</strong>
<%= @group.uri %>
</li>
</ul>
<span><%= link "Edit", to: group_path(@conn, :edit, @group) %></span>
<span><%= link "Back", to: group_path(@conn, :index) %></span>

View File

@ -1,5 +0,0 @@
<h2>Edit Group account</h2>
<%= render "form.html", Map.put(assigns, :action, group_account_path(@conn, :update, @group_account)) %>
<span><%= link "Back", to: group_account_path(@conn, :index) %></span>

View File

@ -1,17 +0,0 @@
<%= form_for @changeset, @action, fn f -> %>
<%= if @changeset.action do %>
<div class="alert alert-danger">
<p>Oops, something went wrong! Please check the errors below.</p>
</div>
<% end %>
<div class="form-group">
<%= label f, :role, class: "control-label" %>
<%= number_input f, :role, class: "form-control" %>
<%= error_tag f, :role %>
</div>
<div class="form-group">
<%= submit "Submit", class: "btn btn-primary" %>
</div>
<% end %>

View File

@ -1,26 +0,0 @@
<h2>Listing Group accounts</h2>
<table class="table">
<thead>
<tr>
<th>Role</th>
<th></th>
</tr>
</thead>
<tbody>
<%= for group_account <- @group_accounts do %>
<tr>
<td><%= group_account.role %></td>
<td class="text-right">
<span><%= link "Show", to: group_account_path(@conn, :show, group_account), class: "btn btn-default btn-xs" %></span>
<span><%= link "Edit", to: group_account_path(@conn, :edit, group_account), class: "btn btn-default btn-xs" %></span>
<span><%= link "Delete", to: group_account_path(@conn, :delete, group_account), method: :delete, data: [confirm: "Are you sure?"], class: "btn btn-danger btn-xs" %></span>
</td>
</tr>
<% end %>
</tbody>
</table>
<span><%= link "New Group account", to: group_account_path(@conn, :new) %></span>

View File

@ -1,5 +0,0 @@
<h2>New Group account</h2>
<%= render "form.html", Map.put(assigns, :action, group_account_path(@conn, :create)) %>
<span><%= link "Back", to: group_account_path(@conn, :index) %></span>

View File

@ -1,13 +0,0 @@
<h2>Show Group account</h2>
<ul>
<li>
<strong>Role:</strong>
<%= @group_account.role %>
</li>
</ul>
<span><%= link "Edit", to: group_account_path(@conn, :edit, @group_account) %></span>
<span><%= link "Back", to: group_account_path(@conn, :index) %></span>

Some files were not shown because too many files have changed in this diff Show More