summaryrefslogtreecommitdiff
path: root/src/com/p4square/grow/frontend/VideosResource.java
blob: caf8dc1cd0b325feea0ee17dda17db3f5d376d4f (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
/*
 * Copyright 2013 Jesse Morgan
 */

package com.p4square.grow.frontend;

import java.util.HashMap;
import java.util.Map;

import freemarker.template.Template;

import org.restlet.data.Form;
import org.restlet.data.MediaType;
import org.restlet.data.Status;
import org.restlet.ext.jackson.JacksonRepresentation;
import org.restlet.representation.Representation;
import org.restlet.resource.ServerResource;

import org.apache.log4j.Logger;

import com.p4square.fmfacade.json.JsonRequestClient;
import com.p4square.fmfacade.json.JsonResponse;

import com.p4square.grow.config.Config;

/**
 * VideosResource returns JSON blobs with video information and records watched
 * videos.
 *
 * @author Jesse Morgan <jesse@jesterpm.net>
 */
public class VideosResource extends ServerResource {
    private static Logger cLog = Logger.getLogger(VideosResource.class);

    private Config mConfig;
    private JsonRequestClient mJsonClient;

    // Fields pertaining to this request.
    private String mChapter;
    private String mVideoId;
    private String mUserId;

    @Override
    public void doInit() {
        super.doInit();

        GrowFrontend growFrontend = (GrowFrontend) getApplication();
        mConfig = growFrontend.getConfig();

        mJsonClient = new JsonRequestClient(getContext().getClientDispatcher());

        mChapter = getAttribute("chapter");
        mVideoId = getAttribute("videoId");
        mUserId = getRequest().getClientInfo().getUser().getIdentifier();
    }

    /**
     * Fetch a video record from the backend.
     */
    @Override
    protected Representation get() {
        try {
            JsonResponse response = backendGet("/training/" + mChapter + "/videos/" + mVideoId);

            if (response.getStatus().isSuccess()) {
                return new JacksonRepresentation<Map>(response.getMap());

            } else {
                setStatus(response.getStatus());
                return null;
            }

        } catch (Exception e) {
            cLog.fatal("Could not render page: " + e.getMessage(), e);
            setStatus(Status.SERVER_ERROR_INTERNAL);
            return null;
        }
    }

    /**
     * Mark a video as completed.
     */
    @Override
    protected Representation post(Representation entity) {
        Map<String, Object> data = new HashMap<String, Object>();
        data.put("completed", "t");
        JsonResponse response = backendPut("/accounts/" + mUserId + "/training/videos/" + mVideoId, data);

        if (!response.getStatus().isSuccess()) {
            // Something went wrong talking to the backend, error out.
            cLog.fatal("Error recording completed video " + response.getStatus());
            setStatus(Status.SERVER_ERROR_INTERNAL);
            return ErrorPage.BACKEND_ERROR;
        }

        setStatus(Status.SUCCESS_NO_CONTENT);
        return null;
    }

    /**
     * @return The backend endpoint URI
     */
    private String getBackendEndpoint() {
        return mConfig.getString("backendUri", "riap://component/backend");
    }

    /**
     * Helper method to send a GET to the backend.
     */
    private JsonResponse backendGet(final String uri) {
        cLog.debug("Sending backend GET " + uri);

        final JsonResponse response = mJsonClient.get(getBackendEndpoint() + uri);
        final Status status = response.getStatus();
        if (!status.isSuccess() && !Status.CLIENT_ERROR_NOT_FOUND.equals(status)) {
            cLog.warn("Error making backend request for '" + uri + "'. status = " + response.getStatus().toString());
        }

        return response;
    }

    private JsonResponse backendPut(final String uri, final Map data) {
        cLog.debug("Sending backend PUT " + uri);

        final JsonResponse response = mJsonClient.put(getBackendEndpoint() + uri, data);
        final Status status = response.getStatus();
        if (!status.isSuccess() && !Status.CLIENT_ERROR_NOT_FOUND.equals(status)) {
            cLog.warn("Error making backend request for '" + uri + "'. status = " + response.getStatus().toString());
        }

        return response;
    }
}