A web-based diary for GPS tracks and activities!
Back End |
|||||||||||
Database (e.g. Play! InMemory for development and MySQL for production) |
|||||||||||
Java
|
|||||||||||
Front End |
|||||||||||
HTML
|
CSS
|
JavaScript
|
Note: Some HTML5 input types are only available in Google Chrome!
public class Application extends Controller {
...
}
@Security.Authenticated(Secured.class)
public class Tad extends Controller {
...
}
User.find.where().eq("email", request().username()).findUnique();
byte bytes[] = new byte[20];
random.nextBytes(bytes);
String salt = bytes.toString();
final MessageDigest messageDigest = MessageDigest.getInstance("SHA-256");
messageDigest.update((password + salt).getBytes());
String hashAndSalted = new String(messageDigest.digest());
@Entity
public class Activity extends Model {
@Id
public Long id;
@NotNull
public Date createdAt = new Date();
...
@ManyToMany
public List- items = new ArrayList<>();
public static Finder
find = new Finder(Long.class, Activity.class);
}
Activity.find.where()
.eq("items.id", item.id)
.eq("kind_id", id)
...
.findList();
activity.save();
activity.update();
activity.delete();
@Required
@Email
@MinLength(value=2)
@Min(value = 0)
@Max(value = 300)
...
@(user: User, itemForm: Form[Item])
@tad("Edit item", user) {
@helper.form(action = routes.Tad.putItem()) {
...
@helper.input(itemForm("name"), '_label -> "") { (id, name, value, args) =>
<input type="text" name="@name" value="@value" id="@id" @toHtmlArgs(args)>
}
...
<button type="submit" class="secondary">Submit</button>
}
}
$.getJSON('@routes.Tad.getStatistics()' + '?' + kind + "&" + item + ..., function(data) {
var ctx = $("#distanceChart").get(0).getContext("2d");
if( bar ) {
new Chart(ctx).Bar(data, options);
}
else {
new Chart(ctx).Line(data, options);
}
...
});
/tad/<action>/<entity>?<parameters>
activity
, item
, kind
put
, delete
, return
, etc.
GET /tad/view/activity controllers.Tad.viewActivity()
GET /tad/view/kind controllers.Tad.viewKind()
GET /tad/view/item controllers.Tad.viewItem()
GET /tad/return/activity controllers.Tad.getActivities()
GET /tad/return/kind controllers.Tad.getKinds()
GET /tad/return/item controllers.Tad.getItems()
...
http://tad.mi.hdm-stuttgart.de/tad/return/activity
http://tad.mi.hdm-stuttgart.de/tad/delete/activity?id=1
http://tad.mi.hdm-stuttgart.de/tad/clone/activity?id=1
A mix of common unit tests and functional tests!
@Test
public void getDistanceTest() {
String kml8 = new KmlReader().read("mocks/test_8_km.kml");
double distance8 = new KmlReader().getDistance(kml8);
Assert.assertEquals(8, distance8, 1);
}
@Test
public void getStatistics() {
running(fakeApplication(inMemoryDatabase()), new Runnable() {
public void run() {
new Mocker().mock();
User tad = User.find.byId(new Long(2));
FakeRequest request = Helpers
.fakeRequest("GET", "/tad/return/statistics")
.withSession("email", tad.email);
Result result = Helpers.routeAndCall(request);
assertThat(Helpers.status(result)).isEqualTo(Status.OK);
...
String content = Helpers.contentAsString(result);
JsonNode json = Json.parse(content);
assertThat(json.size()).isEqualTo(2);
...
}
});
}
Activity.find.where()
.eq("kind_id", id)
.findList();
/
#